search

Home  >  Q&A  >  body text

JavaScript 中,由数组得到字符串的细节问题

在红宝书中,NCZ 说在由数组得到字符串值时,是对数组中的每一项元素调用了相应的方法,比如显式调用数组的 toString() 方法或者在需要使用字符串参数的地方默认调用 toString() 方法,会对数组的各项元素分别调用 toString() 方法,然后得到对应的字符串值。或者显式调用数组的 toLocaleString() 方法,那么就会对各元素也调用 toLocaleString() 方法,然后得到相应的字符串值。
所以按照我的理解,我试着做了更改 Number.prototype.toString = function() { return 'w_e'; } ,然后执行 [1,2].toString() ,但是结果还是 '1,2' 。
请问这里的错误在哪里?谢谢。

巴扎黑巴扎黑2902 days ago355

reply all(3)I'll reply

  • 怪我咯

    怪我咯2017-04-10 15:10:29

    你试试

    javascript[new Number(1), new Number(2)].toString()
    

    顺便

    javascripttypeof 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 章节

    reply
    0
  • 天蓬老师

    天蓬老师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());
    

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:10:29

    我来说一下背后的根本原因吧。

    根据ECMAScript规范,当调用数组的toString方法时,内部其实是调用数组的join方法。即将数组元素拼接起来,元素间用逗号隔开。

    但是在拼接前,需要用ToString这个内部操作将数组元素转为字符串。而12这样的值属于原始类型中的数值类型,它们在ToString的作用下,会变成字符串"1""2"。并不会调用Number.prototype.toString方法。除非像一个答主说的,对[new Number(1), new Number(2)],由于元素是对象类型,才会调用Number.prototypetoString方法。

    根据我的经验,除非你在代码中显式地调用某个原始类型的方法,例如:1 .toSting(),否则JS引擎内部不会把原始类型包装成对应的对象类型,并调用对象的某个方法的。比如,虽然1new Number(1)有很多渊源,但是毕竟他们有天壤之别。

    reply
    0
  • Cancelreply