有(想)趣(死)的代码
数据类型及变量声明
代码: 思考下面 console.log
语句打印内容
var u = undefined;
if(typeof u === 'object'){
var str = 'Hello World';
}
console.log(str);
var n = null;
if(typeof n === 'object'){
var str = 'PHP is the best language in the world.';
}
console.log(str);
答案: 1, undefined, 2, PHP is the best language in the world.
解释:
typeof undefined === 'undefined'
,typeof null === 'object'
因为声明提前, 而且没有局部作用域, 所以即使没有执行到第一个if中的语句
str 一样是声明了,但未赋值, 所以是undefined
数据类型转换
代码: 思考下面 console.log
语句打印内容
var flag = new Boolean(false);
if(flag) {
console.log('true');
}else{
console.log('false');
}
答案: true
解释:
所有的对象类型(引用类型)转换成Boolean值时都是true
[{},[],new Boolean(true),new Boolean(false)]
=>true
delete 运算符
代码: 思考下面 console.log
语句打印内容
var obj = {
val: 'Hello World',
mes: 'PHP is the best language in the world.'
}
delete obj.mes;
console.log('mes' in obj);
var arr = [0,1,2];
delete arr[1];
console.log(arr, arr.length);
答案: false [0,empty,2], 3
解释:
delete
运算符用于删除对象的属性
in
运算符用来测试obj
对象中是否存在mes
属性, 存在返回true
delete
删除数组时, 会在删除指定的元素, 但被删除位置为空(稀疏数组)
所以不会影响数组长度
包装对象与原始数据类型
代码: 思考下面 console.log
语句打印内容
var s = 'text';
s.len = 4;
var t = s.len;
console.log(t);
答案: undefined
解释:
字符串没有属性或方法
对象: 是一种复合值, 是属性和已命名值得集合
s 是字符串, 不是一个new String()
的实例(对象)
所以 s 不是对象,所以 s 没有属性
为什么字符串可以调用一些属性或方法?例如:
s.length
,s.slice()
s 调用属性的时候会使用 s 的值封装一个String
对象
然后用这个临时对象去调用
一旦调用结束, 这个对象就会被销毁
所以上面的代码
s.len = 4
只是给一个临时对象赋予了一个len属性
所以下面再去读取s.len
的时候是undefined
递增运算符
代码: 思考下面 console.log
语句打印内容
var i = 0;
for(var j=0;j<100;j++){
i = i++;
}
console.log(i);
答案: 0
解释:
这是一个一元运算递增中前置和后置的区别
语句中首先执行i++
, 这个时候i
从0
变成1
然后i++
要返回一个值, 因为是后置, 所以返回没有递增之前的值0
之后执行赋值语句, 就是把i++
的返回值赋值给i