一些有趣的代码段

版权声明:本文为博主原创文章,未经博主允许不得转载。如有错误,欢迎评论指正,谢谢! https://blog.csdn.net/z_e_n_g/article/details/83039004

有(想)趣(死)的代码

数据类型及变量声明

代码: 思考下面 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

解释:

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++, 这个时候 i0 变成 1

然后 i++ 要返回一个值, 因为是后置, 所以返回没有递增之前的值 0

之后执行赋值语句, 就是把 i++ 的返回值赋值给 i

猜你喜欢

转载自blog.csdn.net/z_e_n_g/article/details/83039004
今日推荐