首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Object.keys在字符串、布尔值、数字和对象的原型上不能像预期的那样工作?

Object.keys方法返回一个由对象的可枚举属性组成的数组。它不会遍历对象的原型链,也不会返回非可枚举属性。

  1. 对于字符串,布尔值和数字类型的原始值,它们不是对象,因此不能直接调用Object.keys方法。如果我们尝试调用Object.keys('abc'),它会抛出一个TypeError错误。如果需要对原始值进行操作,可以使用包装对象将其转换为对象后再使用Object.keys方法。

例如:

代码语言:txt
复制
const str = 'abc';
const strObj = new String(str);
console.log(Object.keys(strObj)); // 输出:['0', '1', '2']
  1. 对于对象的原型,Object.keys方法也无法直接工作。原型是对象的属性集合,它通常不是可枚举的。如果我们尝试调用Object.keys(Object.prototype),它会返回一个空数组。

例如:

代码语言:txt
复制
console.log(Object.keys(Object.prototype)); // 输出:[]

总结来说,Object.keys方法只能用于遍历对象自身的可枚举属性,不能用于原始值或对象的原型。在实际开发中,我们通常会使用其他适当的方法来处理不同类型的数据。

如果需要了解更多关于Object.keys方法的详细信息,可以参考腾讯云的文档: 腾讯云产品链接:Object.keys

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

javaScript的七种数据类型大全

它会检查右边构建函数的原型对象(prototype),是否在左边对象的原型链上。因此,下面两种写法是等价的。 ?...你可以这么理解Date也是一个对象,也属性Object类型。 instanceof的原理是检查右边构造函数的prototype属性,是否在左边对象的原型链上。...有一种特殊情况,就是左边对象的原型链上,只有null对象。这时,instanceof判断会失真。 ?...= 比较运算符:>,>=,<,<= 并且,或运算:&&,|| (这两个运算符一般搭配前面的运算符一起参与运算) 如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值...对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。

2.2K40
  • Object对象

    此外,冻结一个对象后该对象的原型也不能被修改,Object.freeze()返回和传入的参数相同的对象。 示例 Object.freeze(obj) obj: 要被冻结的对象。...示例 Object.getOwnPropertyNames(obj) obj: 一个对象,其自身的可枚举和不可枚举属性的名称被返回。 返回在给定对象上找到的自身属性对应的字符串数组。...Object.keys()方法会返回一个由一个指定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用for in循环遍历该对象时返回的顺序一致,区别在于for in循环还会枚举原型链中的属性...由于现代JavaScript引擎优化属性访问所带来的特性的关系,更改对象的[[Prototype]]在各个浏览器和JavaScript引擎上都是一个很慢的操作。...示例 prototypeObj.isPrototypeOf(object) object: 在该对象的原型链上搜寻。 返回表示调用对象是否在另一个对象的原型链上的Boolean。

    2.3K10

    js 数据类型笔记

    有需要的朋友建议直接观看阮一峰老师javascript教程,写得更详细 一:数据类型概述 1、简介6种数据 1.1数值(number):整数和小数 1.2字符串(string):文本 1.3布尔值(boolean...undefined // "undefined" 二、null, undefined 和布尔值 1、null, undefined转数字化 null 转为数字是 0 undefined 转为数字是 NAN...双引号字符串的内部,可以使用单引号,不能直接使用双引号 'key = "value"' 2.2 在单引号字符串的内部,使用单引号,就必须在内部的单引号前面加上反斜杠,用来转义 'Did she say...4.1属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。...8、对象的使用方法 8.1 检查变量是否声明 原理:在浏览器环境,所有全局变量都是window对象的属性。

    2K20

    JS葵花宝典秘籍笔记,为你保驾护航金三银四

    return x+y+z; } Object.keys() Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致...语法Object.getOwnPropertyNames(obj) 参数 obj 一个对象,其自身的可枚举和不可枚举属性的名称被返回。 返回值 在给定对象上找到的自身属性对应的字符串数组。...需要传入一个对象,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。 返回值 一个新对象,带着指定的原型对象和属性。...对于字符串、数字及布尔值来说(不是 String、Number 或者 Boolean 对象),slice 会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。...Boolean()会将参数转换成布尔值,并返回一个包含该值的Boolean对象。 0,NaN,null,空字符串""和undefined都会转成false。

    1.9K10

    深入理解JavaScript(一)

    2.语句:语句表示了一种行为,如循环和if语句,一个程序基本上就是语句的序列。凡是在JS期望语句的地方都可以写表达式,这样的语句叫做表达式语句。反之则不然,不能在需要表达式的地主使用语句。...;没有八进制的数字 ; 八、值 A.JavaScript中的类型体系 1.JS是动态类型的语言:变量的类型在编译的时候是不确定的; 2.JS内置的转换机制只支持布尔值、数字、字符串和对象。...出现场景:null是原型链最顶端的元素、当字符串中没有匹配到正则表态式的结果时 检测:if(x===null) D.原始值的包装对象 1.布尔值、数字和字符串这三种原始值都有相应的构造函数:Boolean...2.严格相等 比较两个对象:当且仅当x和y是同一个对象时,x===y; NaN和本身不相等 3.普通(宽松)相等(==,!=) 相等和转换为布尔值的工作原理是不同的。...是否在value的原型链上。

    1.4K30

    你真的了解浅比较么?

    那什么是浅对比呢,为什么对于嵌套的对象就不适用了呢? shallowEqual 在React里,shouldComponentUpdate源码为: if (this....Object.is() 在解析shallowEqual的源码之前,先来认识一下Object.is(),这个函数是用来比较两个值是否相等。 为什么要用这个来比较而不是 == 或者 === 呢?...它在下面6种情况下,会返回true 两个值都是 undefined 两个值都是 null 两个值都是 true 或者都是 false 两个值是由相同个数的字符按照相同的顺序组成的字符串 两个值指向同一个对象...两个值都是数字并且 都是正零 +0 都是负零 -0 都是 NaN 都是除零和 NaN 外的其它同一个数字 可以看出Object.is可以对基本数据类型:null,undefined,number,string...剖析shallowEquall // 用原型链的方法 const hasOwn = Object.prototype.hasOwnProperty // 这个函数实际上是Object.is()的polyfill

    59530

    你真的了解浅比较么?

    那什么是浅对比呢,为什么对于嵌套的对象就不适用了呢? shallowEqual 在React里,shouldComponentUpdate源码为: if (this....Object.is() 在解析shallowEqual的源码之前,先来认识一下Object.is(),这个函数是用来比较两个值是否相等。 为什么要用这个来比较而不是 == 或者 === 呢?...它在下面6种情况下,会返回true 两个值都是 undefined 两个值都是 null 两个值都是 true 或者都是 false 两个值是由相同个数的字符按照相同的顺序组成的字符串 两个值指向同一个对象...两个值都是数字并且 都是正零 +0 都是负零 -0 都是 NaN 都是除零和 NaN 外的其它同一个数字 可以看出Object.is可以对基本数据类型:null,undefined,number,string...剖析shallowEquall // 用原型链的方法 const hasOwn = Object.prototype.hasOwnProperty // 这个函数实际上是Object.is()的polyfill

    1.6K91

    在 JavaScript 中,什么时候使用 Map 或胜过 Object

    在很多方面,它看起来像是一个功能更强的对象,但接口却有些笨拙。 然而,大多数开发者在需要 hash map 的时候还是会使用对象,只有当他们意识到键值不能只是字符串的时候才会转而使用 Map。...为什么对象不符合 Hash Map 的使用情况 在 Hash Map 中使用对象最明显的缺点是,对象只允许键是字符串和 symbol。...名称冲突 当一个对象自己的属性与它的原型上的属性有名称冲突时,它就会打破预期,从而使程序崩溃。 例如,我们有一个函数 foo,它接受一个对象。...我们可以使用 Object.keys、Object.values 和 Object.entry 来获得一个可枚举的字符串键(或/和值)的列表,并通过该列表进行迭代,这引入了一个额外的开销步骤。...integer keys 我之所以特别想在有整数键的对象上运行基准,是因为V8在内部优化了整数索引的属性,并将它们存储在一个单独的数组中,可以线性和连续地访问。

    2.1K40

    Object 中的几个很相似的方法

    () 和 newObject() 这三个方法 in 和 hasOwnProperty() 两方法的区别 ---- 这两个方法用来判断一个属性是否是某个对象中的,都会返回一个布尔值。...in 运算符用来判断属性在指定的对象或其原型链中是否存在。 hasOwnProperty() 方法相较于 in,该方法会 忽略掉那些从原型链上继承到的属性。...注意是可枚举的这一点很重要,像 Array和 Object使用内置构造函数所创建的对象都会继承自 Object.prototype和 String.prototype的属性,如 String 的 indexOf...,但是不能获取到来自父类原型上的属性(当然还要自己原型上的属性)。...比如:数组、布尔值、数字、字符串等,他会把传入的类型包装成一个对象。如果传入的是一个变量,并且这个变量本身就是包装类型(像对象、数组、函数等都属于包装类型)的,那么输出的结果就是对参数的引用。

    59210

    如何在JavaScript中使用for循环

    为什么使用for循环 在JavaScript中,就像在其他编程语言中一样,我们使用循环来读取或访问集合中的项。这个集合可以是一个数组或一个对象。...由于对象可能通过原型链继承数据项,其中包括对象的默认方法和属性,以及我们可能定义的对象原型,因此我们应该使用hasOwnProperty。...在字符串中使用for…in循环 你可以在JavaScript中使用for…in循环来循环字符串。然而,不推荐这么做,因为你将在字符串的索引上循环,而不是字符串本身。...使用for…in循环迭代对象 因为for...in循环只迭代对象的可枚举属性,也就是对象自有属性,而不是像toString这样属于对象原型的属性。所以使用for...in循环来迭代对象是很好的。...如果你想支持像IE这样的浏览器,这一点尤其重要,因为IE是按照数组项创建的顺序而不是按照索引的顺序进行迭代的。这与当前现代浏览器的工作方式不同,后者是根据索引的升序来迭代数组的。

    5.1K10

    鹅厂原创 | Nodejs进阶:核心模块Buffer常用API使用总结

    那什么是浅对比呢,为什么对于嵌套的对象就不适用了呢? (左右滑动查看代码) 1shallowEqual 在React里,shouldComponentUpdate源码为: if (this....2Object.is() 在解析shallowEqual的源码之前,先来认识一下Object.is(),这个函数是用来比较两个值是否相等。 为什么要用这个来比较而不是 == 或者 === 呢?...它在下面6种情况下,会返回true: 两个值都是 undefined 两个值都是 null 两个值都是 true 或者都是 false 两个值是由相同个数的字符按照相同的顺序组成的字符串 两个值指向同一个对象...两个值都是数字并且 都是正零 +0 都是负零 -0 都是 NaN 都是除零和 NaN 外的其它同一个数字 可以看出Object.is可以对基本数据类型:null,undefined,number,string...3剖析shallowEquall // 用原型链的方法 const hasOwn = Object.prototype.hasOwnProperty // 这个函数实际上是Object.is()的polyfill

    36830

    JS原生引用类型解析1-Object类型

    两个值都是数字并且 都是正零 +0 都是负零 -0 都是 NaN 都是除零和NaN外的其它同一个数字 这种相等性判断逻辑和传统的 == 运算符所用的不同,== 运算符会对它两边的操作数做隐式类型转换...Object.keys() 返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用for...in...循环遍历该对象时返回的顺序一致 (两者的主要区别是for-in 循环还会枚举其原型链上的属性...构造函数新建实例对象时,在实例对象调用会指向实例对象的原型对象。该特性为非标准特性,尽量不要使用。...Object.prototype.isPrototypeOf() 该方法返回一个布尔值,表示指定的对象是否在本对象的原型链中。...()方法列出,如果这样的话,也说得通),不知道底层具体是如何来实现的,如果是共享自Object原型,为什么每一个实例的值都是不同的。

    2.1K10

    ECMAScript 6笔记(Symbol, Proxy 和 Reflect)

    注意,Symbol值作为对象属性名时,不能用点运算符。同理,在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号之中。...obj对象的原型,obj对象本身并没有time属性,所以根据原型链,会在proxy对象上读取该属性,导致被拦截。...现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect对象上。 (2)修改某些Object方法的返回结果,让其变得更合理。...这就让Proxy对象可以方便地调用对应的Reflect方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy怎么修改默认行为,你总可以在Reflect上获取默认行为。...添加的工作,就是将每一个操作输出一行日志。 3.2 Reflect对象的方法 Reflect对象的方法清单如下,共14个。

    50220

    前端系列11集-ES6 知识总结

    关键字 作为函数调用时,代表父类的构造函数 作为函数时只能用在子类的构造函数之中 作为对象时 在普通方法中指向父类的原型对象 在静态方法中指向父类 类的 prototype 属性和 __proto__...用来获取一个对象的原型对象 Object.setPrototypeOf 用来设置一个对象的原型对象并返回参数对象 遍历 Object.keys 获取参数对象自身的所有可遍历属性的键名 Object.values...new 命令 Symbol 函数的参数只是表示对当前 Symbol 值的描述,相同参数的 Symbol 函数的返回值是不相等的 Symbol 值不能与其他类型的值进行运算 Symbol 值可以显式转为字符串和布尔值...normalize Unicode 正规化,用来将字符的不同表示方法统一为同样的形式 查找字符 includes 表示是否找到了参数字符串 startsWith 表示参数字符串是否在原字符串的头部 endsWith...都是从全局方法上移植过来的 只返回第一个数字 允许开头和结尾空格 第一个字符不能被转换为数字 时返回 NaN Number.EPSILON 常量表示 1 与大于 1 的最小浮点数之间的差 JavaScript

    17620
    领券