首页 > 数值和布尔值的解构赋值的一个问题

数值和布尔值的解构赋值的一个问题

看阮老师的es6,有个问题如下:

let {toString:s}=123;
console.log(s===Number.prototye.toString)//true
console.log(s);//function toString()

let {a:s}=123;
console.log(s);//undefined

阮老师给出的解释是:解构赋值时,如果等号右边是数值或者布尔值,那么会先转为对象,上面的代码中,数值的包装对象有toString方法,所以变量s可以取到。
然后我直接输出了s,结果是toString()方法

不明白为什么这个解构赋值之后,s就是toString()方法了,阮一峰老师说的转化为对象,这其中又是如何转化的呢???这个和下面那个解构赋值的区别又是什么呢??


按阮一峰老师说的话,其实很好理解了。

let { toString : s } = 123; 
// 可以换成两步
let temp = new Number(123);
let { toString : s } = temp;

// temp对象因为有toString属性,所以解构成功,然后将toStirng变量用新的变量s代替

let { a : s } = 123 是因为解构失败,所以是undefined。

不知道我理解的对不对。


我的理解

let {toString:s}=123;
//转换为对象包装类型
var temp=new Number(123);
//这个实例化对象指向Number构造函数的原型
console.log(temp.__proto__===Number.prototype);//true
//Number原型对象中有toString方法 找到后对s进行赋值
Number.prototype={
    //..
    toString:function(){}
    //..
}

console.log(s===Number.prototye.toString)//true
console.log(s);//function toString()

let {a:s}={a:12312};
console.log(s); //12312

let {toString:t}=123; 
123.toString(); //“123”
console.log(t.call(111)); //111

第一个赋值时相当于{a:12312}这个object的属性赋值给s
第二个,相当于123这个Number的方法toString 赋值给t


我的理解是解构赋值时,如果等号右边是数值或者布尔值,那么会先转为对象,然后再遍历对象中的所有方法,如果找到对应的方法,则解构成功,否则失败。
就拿你的例子,123转变为对象后拥有toString方法,所以第一个解构成功,但是由于没有a方法,所以第二个解构失败。再比如let { log, sin, cos } = Math;这个,由于Math对象拥有前面三个方法,所以解构成功。

【热门文章】
【热门文章】