在红宝书中,NCZ 说在由数组得到字符串值时,是对数组中的每一项元素调用了相应的方法,比如显式调用数组的 toString() 方法或者在需要使用字符串参数的地方默认调用 toString() 方法,会对数组的各项元素分别调用 toString() 方法,然后得到对应的字符串值。或者显式调用数组的 toLocaleString() 方法,那么就会对各元素也调用 toLocaleString() 方法,然后得到相应的字符串值。
所以按照我的理解,我试着做了更改 Number.prototype.toString = function() { return 'w_e'; } ,然后执行 [1,2].toString() ,但是结果还是 '1,2' 。
请问这里的错误在哪里?谢谢。
怪我咯2017-04-10 15:10:29
你试试
javascript
[new Number(1), new Number(2)].toString()
顺便
javascript
typeof 1 // "number" typeof new Number(1) // "object"
number 类型的值和 Number 对象是不一样的,再举个例
javascript
!!0 // false !!new Number(0) // true
参考 ECMA-262 的第 4.3.19-4.3.21 和 8.5 章节
天蓬老师2017-04-10 15:10:29
这是说的每一项元素应该是指非基本类型元素,像数字和布尔值等基本类型函数应该不会。不信你可以试一下这个 DEMO:
var arr = [function a(){}, function b() {}];
console.log("Normal toString: ", arr.toString());
Function.prototype.toString = function() { return this.name; };
console.log("Custom toString: ", arr.toString());
大家讲道理2017-04-10 15:10:29
我来说一下背后的根本原因吧。
根据ECMAScript规范,当调用数组的toString
方法时,内部其实是调用数组的join
方法。即将数组元素拼接起来,元素间用逗号隔开。
但是在拼接前,需要用ToString
这个内部操作将数组元素转为字符串。而1
、2
这样的值属于原始类型中的数值类型,它们在ToString
的作用下,会变成字符串"1"
、"2"
。并不会调用Number.prototype.toString
方法。除非像一个答主说的,对[new Number(1), new Number(2)]
,由于元素是对象类型,才会调用Number.prototype
的toString
方法。
根据我的经验,除非你在代码中显式地调用某个原始类型的方法,例如:1 .toSting()
,否则JS引擎内部不会把原始类型包装成对应的对象类型,并调用对象的某个方法的。比如,虽然1
和new Number(1)
有很多渊源,但是毕竟他们有天壤之别。