x=1、y=4、z=4
解析:JavaScript在预编译期会使用function add(n){ return n = n + 3;}覆盖掉前面声明的add方法。
100、undefined、101
解析:本题重点考察变量作用域,以及函数调用返回值问题,函数nAdd()没有声明返回值,则默认返回值为undefined。
undefined、报错
解析:使用var声明变量,但未对其赋值进行初始化时,这个变量的默认值为undefined,而变量b未声明先使用将报错。注意,未声明和未赋值是不同的概念。
4. true、true、false、true、true、false、true、true
解析:本例各个特殊值比较说明如下。
- Undefined与Null相等,但不恒等(===)。
- 一个是Number,一个是String时,会尝试将String转换为Number。
- 尝试将Boolean转换为Number,即0或1。
- 尝试将Object转换成Number或String,取决于另外一个对比量的类型。
所以,对于0、空字符串的判断,建议使用“===”。“===”会先判断两边的值类型,类型不匹配时为false。
值为111,类型为Number
解析:先转换为字符串相连接,然后再转换为数字相减。
2
解析:考察引用数据类型应用技巧。
undefined 和 2
解析:上面代码相当于下面代码。
var foo = 1; function(){ var foo; console.log(foo); //undefined foo = 2; console.log(foo); // 2; }
函数声明和变量声明会被JavaScript引擎隐式提升到当前作用域的顶部,但是只提升名称不会提升赋值操作。
function a() {}、2
解析:var和function会提前声明,且function优先于var声明。所以提前声明后输出的a为function,然后代码往下执行,a被重新赋值,所以第二次输出为2。
10、报错、30
解析:function(){}内声明的变量是局部变量,而没有使用var声明的变量是全局变量。while{}、if{}、for(){}之内声明的变量都是全局变量,除非其被包含在function内。
10
解析:function和var会提前声明,而{...}内的变量也会提前声明。代码还没执行前,a变量已经被声明,于是'a' in window返回true,a被赋值。
NaN、'undefined 'hello'
解析:给基本类型数据加属性不报错,但是引用的话返回undefined,10+undefined返回NaN,而Undefined和String相加时转变成了字符串。
function
解析:因为函数声明优于变量声明。在代码逐行执行前,函数声明和变量声明会提前进行,而函数声明又会优于变量声明,这里的优于可以理解为晚于变量声明后,如果函数名和变量名相同,函数声明就能覆盖变量声明。所以以上代码将函数声明和变量声明调换顺序还是一样结果。
true、true、false
解析:unedfined和false都是特殊数据类型,但是用双引号引起了就不是本身类型了,而是字符串,空串相当于false,否则是true。