为什么函数变量可以没有对象属性和数字变量?

时间:2017-11-11 01:50:39

标签: javascript variables

当我使用变量时,我发现了非常神秘的东西。

请参阅下面的摘录。



var abc = function(){};
abc.prop = 1;

console.log(abc);
console.log(abc.prop);






var abc = 3;
abc.prop = 1;

console.log(abc);
console.log(abc.prop);




问题1:为什么使用abc.prop即使它们不是对象也不输出断言错误?

问题2:如果变量的类型是函数,则可以定义它的属性,如果变量的类型是数字,则不能定义它的属性。为什么会这样?

3 个答案:

答案 0 :(得分:2)

为什么第一个代码段的console.log(abc);只显示函数体,而没有prop属性?

因为console.log()被定义为: "如果它是一个功能,只需显示它的正文。"

如何获取Function对象的属性?

您可以使用

  • Object.getOwnPropertyNames(abc)所有属性'名称,
  • Object.keys(abc)代表可枚举的属性'名称,
  • Object.values(abc)代表可枚举的属性'值,
  • Object.entries(abc)用于可枚举的属性'名称和价值观。

与任何其他Object一样。

答案 1 :(得分:1)

在JavaScript中,函数是第一类对象,因此被视为对象。因为在您的第一个片段中,您已声明变量abc为' function',它可以具有属性,就像任何其他js对象一样。在第二个片段中,您已将其声明为类型编号,这不允许您声明属性。

看到这个: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions

答案 2 :(得分:1)

根据MDN

  

数据类型:

     

最新的ECMAScript标准定义了七种数据类型:

     
      
  • 六种原始数据类型:      
        
    • 布尔
    •   
    •   
    • 未定义
    •   
    •   
    • 字符串
    •   
    • 符号(ECMAScript 6中的新内容)
    •   
  •   
  • 和对象
  •   

原始值不会从Object继承,因此您无法为其分配属性。

复制原始值,而不是使用对它们的引用传递。

如果数字是Number的实例:

,您可以为数字指定属性

var abc = new Number(55);   // abc inherits from Object via the Number class
abc.prop = 1;               // so this is valid

console.log(abc);
console.log(abc.prop);

注意: abc的控制台日志错误,因为SO console.logabc记录为一个对象,应将其记录为数字。请改用浏览器控制台。 (abc确实是一个对象,因为它通过类ObjectNumber继承,但它应该记录为数字,因为它是Number的实例。 / p>