javascript中的未定义和未声明
我们在项目中,经常会定义一些变量(很多时候,定义过多的全局变量),当我们调用这些变量的时候,就会发生各种各样的突发状况。
看一个示例:
var a;
typeof a;
typeof b;
很简单的一段javascript代码,那么会输出什么呢?
var a;
typeof a; // undefined
typeof b; // undefined
那么a和b有什么区别呢?很明显,a声明了,但是未赋值,b直接就是未声明,那通过typeof 检测都返回undefined是不是让人很迷惑?
而当我们调用这两个变量的时候,

调用a的时候,输出了undefined,不难理解。
调用b的时候,浏览器报错,b is not defined。
这是个什么鬼?
not defined 难道不是undefined的意思?
也确实,从浏览器角度来讲,报not defined 其实真正表述的意思是,该变量未声明。
在《你不知道的javascript(中)》中,讲到这里的时候,
Similar to above, it would have been nice if typeof used with an undeclared variable returned "undeclared" instead of conflating the result value with the different "undefined" case.
大意是说,使用typeof 变量,检测变量类型的时候,这时候如果对于未声明的变量返回“undeclared”以区别于undefined,就不会那么让人迷惑了。
然而这里有个关键性的问题就是:
javascript中,变量是没有类型的,只有变量的值才有类型,而且javascript只支持6种类型值,undefined, null, boolean, number, string, object,在ES6种,新增了一种symbol,所以typeof 变量,他检测的是变量的值的类型,返回的也是变量的值的类型,他并不关心变量是否声明,他也没有办法关心变量是否声明,因为javascript关心的是值而已,变量的存在仅仅是为了方便我们来使用这些值,所以typeof 变量,无论如何也不可能返回undeclared。
javascript中的未定义和未声明的更多相关文章
- JavaScript 中定义变量时有无var声明的区别
关于JavaScript中定义变量时有无var声明的区别 var a=5; //正确 a=5; //正确 在javascript中,以上两种方法都是定义变量的正确方法.微软的Script56.CHM中 ...
- 预定义的类型“System.Object”未定义或未导入
打开一个以前的程序 ,发现报这个错误.检查了程序,发现程序的引用 System 不见了 ,尝试 引用失败.. 查了有人说重新建立 Sln文件有用.. 一头雾水,随后 尝试操作 ,程序有用了 具体步骤: ...
- 从架构层面杜绝lua中使用未定义的变量
# 从架构层面杜绝lua中使用未定义的变量 标签(空格分隔): lua --- lua中有一个很坑的地方:1.就是如果一个变量拼写错误,会自动的认为你定义了一个值为nil的全局变量.2.如果在func ...
- C++中的"未定义的行为"
2.1 位运算 位运算的运算对象是整数类型的,并且把运算对象看成是一个二进制位的集合.运算对象可以是带符号也可以是无符号.如果是带符号且值为负,那么位运算如何处理运算对象的符号位依赖于机器.而且此时的 ...
- 情景剧:C/C++中的未定义行为(undefined behavior)
写在前面 本文尝试以情景剧的方式,轻松.直观地解释C/C++中未定义行为(undefined behavior)的概念.设计动机.优缺点等内容1,希望读者能够通过阅读本文,对undefined beh ...
- WPF/UWP 的 Grid 布局竟然有 Bug,还不止一个!了解 Grid 中那些未定义的布局规则
只要你用 XAML 写代码,我敢打赌你一定用各种方式使(nuè)用(dài)过 Grid.不知你有没有在此过程中看到过 Grid 那些匪夷所思的布局结果呢? 本文将带你来看看 Grid 布局中的 Bu ...
- 解读JavaScript中的Hoisting机制(js变量声明提升机制)
hoisting机制:javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 知识点一:javascript是没有 ...
- JavaScript中的迭代器和生成器[未排版]
JavaScript中的迭代器 在软件开发领域,"迭代"的意思是按照顺序反复多次执行一段程序,通常会有明确的终止条件. ECMAScript 6规范新增了两个高级特性:迭代器和生成 ...
- strcasecmp在VS2010中提示未定义标识符
分析: strcasecmp(*,*)是用来比较字符串,定义在string.h头文件中,但是在windows下即使添加string.h头文件,依然会报错. 解决: 添加 #if defined(_MS ...
随机推荐
- [shell]find命令
find ./ -mtime 18 -exec ls -l {} \; 该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为: {} 代表的是『由 find 找到的内 ...
- Linux下安装CollabNetSubversionEdge
1.首先下载CollabNet Subversion,目前最新版本Subversion Edge 5.2.2 (Linux 64-bit),注意下载的时候需要注册下账号,才允许下载: 2.安装Coll ...
- Jmeter ----Bean shell使用
一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...
- 基于MVC4+EasyUI的Web开发框架形成之旅(7)--权限控制
我在上一篇随笔<基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍>中大概介绍了基于MVC的Web开发框架的权限控制总体思路.其中的权限控制就是分为“用户登录身份验证” ...
- PHP中的插件机制原理和实例
PHP项目中很多用到插件的地方,更尤其是基础程序写成之后很多功能由第三方完善开发的时候,更能用到插件机制,现在说一下插件的实现.特点是无论你是否激活,都不影响主程序的运行,即使是删除也不会影响. 从一 ...
- 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href
阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href 1.查找以<a>开头的所有文本,然后判断href是否在<a> ...
- 手机开发者模型,上方显示p dx dy xv yv
prs:当前压强 (红色的时候 表示 压强趋向稳定或达到最大压强)p:触碰点状况p:(x/y) x为当前监控的触摸点 y为当次触摸屏幕操作最大触摸点个数 你可以理解为 y是有多少根手指放过在屏幕上 x ...
- java取余%练习
package ltb6w1; import java.io.*; public class TestMod { String st; int c; InputStreamReader is=new ...
- RTB业务知识之1-原生广告
一.背景 Native Advertising (Native Ads), 又称为原生广告, 是2013全球媒体界爆红的关键词,从2012年年底,就有人开始提了这个名词,接着到处都可以看到这个名词,再 ...
- 【Nginx】之安装使用和配置SSL支持
本文采用的是nginx源码安装 1.下载nginx源码包 wget http://nginx.org/download/nginx-1.8.0.tar 或者登录nginx官网下载更高版本 2.ngin ...