请问这些javascript表达式的结果是?为什么?

  1. [,,,].join(", ")

  2. some codes:

    function foo() { } 
    var oldName = foo.name; 
    foo.name = "bar"; 
    [oldName, foo.name]
    
  3. var a = new Date("epoch")

  4. some codes:

    var a = Function.length, b = new Function().length 
    a === b
    
阅读 6.4k
5 个回答
  1. [,,,]返回的是一个[undefinedx3]的数组。为什么是3个而不是4个,那是因为最后一个逗号因为最后一个元素没有被定义而被忽略了,类似于[1,2,3,]。至于对此空数组做连接就不多表,有图有真相。
    问题一

  2. 返回结果还是['foo','foo'],因为ECMA规定了foo.name这个值是可读不可写的。

    This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. - Function name

  3. 返回Invaild Date。Date类解析字符串时间的格式是使用Date.parse函数的,关于函数支持的时间字符串格式 MDN 上有详细的说明,具体不多表,有图有真相。
    问题三

  4. 返回false。这个问题等同于问Function.length === Function.prototype.length。一个是Function自己参数的长度,一个是通过Function构造函数继承过来参数的长度。至于答案为什么分别是1和0,MDN上也有比较清楚的说明:

    Data property of the Function constructor

    The Function constructor is itself a Function object. It's length data property has a value of 1. The property attributes are: Writable: false, Enumerable: false, Configurable: true.

    Property of the Function prototype object

    The length property of the Function prototype object has a value of 0.
    - Function.length

  1. [,,,]虽然是有三个逗号,但它是三个元素,数组字面量最后一个逗号如果没有内容就会被忽略,[1,2,3,]和[1,2,3]是一样的。三个元素join的时候,会只用两个分隔符插值,比如[1,2,3].join()的时候会变成"1,2,3",最后一个元素不会被插入分隔符。

  2. 函数的name这个属性,修饰符定义为{configurable:false,enumerable:false,writable:false},意思是不可删、枚举不到、不可该写,你如何前面加"use strict";就会发现foo.name = "bar"这句会提示TypeError,函数的name在定义的时候就已经被指定了,所以这里都是"foo"

  3. Date构造器如果碰到无法解析成时间的字符串时,都会返回Invalid Date,注意这还是一个Date,拥有正常Date的所有方法,比如getTime()getDay()之类的

  4. 一个函数的length,和它被定义的时候有关,举个例子
    function sum(a,b){}
    这个函数在定义的时候指定了两个参数,所以sum.length也等于2。
    new Function()生成了一个空函数,类似于function abc(){},它的length的默认值自然就是0了
    Function作为一个构造函数,本身也是一个函数,它的length为1,这个可以参见ES5规范文档。

问题2

结果肯定是 ['foo','foo']了。

Function.name 是只读的,代表了函数的名称。匿名函数名称为 '',例如:

function mew(){}

var meo=function(){};

console.log(mew.name); // 'mew'

console.log(meo.name); // ''

问题3

var表达式应该是undefined吧。这里的a是Invalid Date或者是NaN(IE下吧)

问题4

Function.length是函数参数的个数,new Function()则是定义了一个“空”的函数,当然参数个数为零,而Function本身的构造函数参数是不固定的,但Function.length的返回值被定义为1,所以这个表达式的结果为false。

上面的解答没有查文档,如果希望了解更详细的内容,可以Google一下相关的关键词。

第1点,如2楼所述,我要补充的是在IE9以下的版本中,会创建4项数据,每一项都是undefined, 不建议这样创建数组

1 . 将数组元素用逗号相连(串连),[1,2,3].join(',')结果“1,2,3”,注意最后面没有逗号。

2 . foo.name是函数的名字,所以oldName是"foo",你可以试下将一个匿名函数赋值给foo

var foo = function() {};
var oldName = foo.name;
foo.name = "bar";
[oldName, foo.name];

3 . 构造一个Date对象,似乎是无效的; 如果要获得当前的时间,可以用“new Date()"

var d = new Date();
// 获得unixtime
d.getTime();

4 . 是比较对象的长度么?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏