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

为什么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葵花宝典秘籍笔记,为你保驾护航金三银四

    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

    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

    你真的了解浅比较么?

    那什么是浅对比呢,为什么对于嵌套的对象就不适用了呢? 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

    你真的了解浅比较么?

    那什么是浅对比呢,为什么对于嵌套的对象就不适用了呢? 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

    59330

    在 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

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

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

    2.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

    36730

    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

    JS方法比较

    Object.keys() Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致。...修复了ES5引入的for...in的不足 for...of不能循环普通的对象,需要通过和Object.keys()搭配使用 注释: for...of循环不会循环对象的key,只会循环出数组的value,...因此for...of不能循环遍历普通对象,对普通对象的属性遍历推荐使用for...in。...(不包含结束位置上的字符串) 5. find 和 findIndex find 方法返回第一个满足条件的值,如果没有满足条件的值,find 会返回 undefined findIndex 方法则返回这个值在数组里的索引...判断对象存在某个属性 in 和 Object.prototype.hasOwnProperty.call() 如果指定的属性在指定的对象或其原型链中,则in 运算符返回true。

    6.3K00
    领券