javascript - 数值和布尔值的解构赋值的一个问题
怪我咯
怪我咯 2017-04-11 10:56:50
[JavaScript讨论组]

看阮老师的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()方法了,阮一峰老师说的转化为对象,这其中又是如何转化的呢???这个和下面那个解构赋值的区别又是什么呢??

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(4)
怪我咯
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对象拥有前面三个方法,所以解构成功。

大家讲道理

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

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()
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号