前言
JavaScript 中目前有 7 种基本(原始primitives
)数据类型 Undefined
, Null
,Boolean
, Number
, String
,BigInt
,Symbol
,以及一种引用类型 Object
,Object
中又包括 Function
,Date
,JSON
,RegExp
等,除了 7 种原始类型,其他的所有能够用 new
实例化的内置类型都是 Object
构造的。
数据类型
对于数据了类型我们可以通过 typeof
运算符来判断,具体结果看下图。
原始类型中两个比较特殊的就是 Undefined
和 Null
,他们两个类型都只有一个值就是 undefined
和 null
。
Undefined
undefined
一般表示我们未对变量进行初始化。使用 typeof
操作符的时候,如果是未声明变量,同样也会返回 undefined
,再比如未设置返回值的函数执行的结果是 undefined
,未设置的参数也会被默认为 undefined
。最后还有一点需要注意的是,undefined
并不是 js 的保留字,并且是全局对象的一个属性,在浏览器环境中就是 window.undefined
。当在局部环境中,我们是可以自己给 undefined
属性赋值的,也就是重写 undefined
,所以为了确保我们使用的 undefined
是未被重写的,我们可以使用 void 0
来代替。
Null
null
可以简单理解为一个未被创建的对象,比如我们使用 document.getElementById
并没有找到对应元素的时候就会返回 null
。null
和 undefined
有一些区别,在转换为 Number
的时候,null
会转换为 0
而 undefined
会转换为 NaN
,执行 typeof
运算的时候,undefined
返回 undefined
而 null
返回 object
。使用 ==
判断两者相等会返回 true
,所以为了防止误判一般我们使用全等 ===
。null
是所有对象原型链的终点,Object.prototype.__proto__ === null
。
关于 null
的使用,当我们声明一个变量是用来存储对象我们可以先赋值为 null,当一个对象不再需要的时候,我们可以设置为 null
解除这个引用。
Symbol 和 BigInt
这两个都是 ES6 新增的原始数据类型,Symbol
类型的数据通过 Symbol()
方法的执行产生,不过需要注意的是 Symbol
不能作为构造函数,每个从 Symbol()
返回的 symbol
值都是唯一的。一个 symbol
值能作为对象属性的标识符;这是该数据类型仅有的目的。
而 BigInt 则是为了精确表示超出双精度浮点数的最大安全表示范围的大数而新增的基本数据类型。
判断数据类型的方法
typeof 运算符
最简单的判断数据类型的方法是 typeof 运算符,返回值为字符串。typeof 的缺点是除了 Function 以外的其他所有对象的返回值都是 object (null 的返回值也是 object),如果我们需要区分不同的对象,就无法使用 typeof。
instanceof 运算符
instanceof
运算符是检测构造函数的原型是否出现在某个对象的原型链上。通过 instanceof
运算符我们可以实现对 Object
类型的细分,确定属于哪种对象。但是 instanceof
的缺点是只能对对象进行检测,对于基本数据类型的实例无法检测(字面量无法检测,但是通过基本包装类型的构造函数创建的基本类型可以进行检测)。
constructor 属性
利用实例的 constructor
属性来辅助判断实例的数据类型也是一种手段。一般来说,实例本身是没有 constructor
属性的,我们所看到的属性都是 实例.__proto__.constructor
,换言之也就是实例的构造函数,这种方式对基本数据类型也是有效的。这种方法的一个比较大的问题是 constructor
属性是个不受保护的属性,随时可能被更改,我们既可以给实例增加 constructor
属性,也可以修改构造函数的 prototype
的引用,也可以直接修改原型的 constructor
属性。
Object.prototype.toString.call()
这是最安全准确的检测数据类型的方法,每一种数据类型的构造函数的原型上都有 toString
方法,但是除了 Object.prototype
上的 toString
是用来返回当前实例所属类的信息(检测数据类型的),其余的都是转换为字符串的。该方法可以准确检测所有内置类型。自定义类型的返回值为 Object Object
let toString = Object.prototype.toString //=>Object.prototype.toString console.log(toString.call(10)); //=>"[object Number]" console.log(toString.call(NaN)); //=>"[object Number]" console.log(toString.call("xxx")); //=>"[object String]" console.log(toString.call(true)); //=>"[object Boolean]" console.log(toString.call(null)); //=>"[object Null]" console.log(toString.call(undefined)); //=>"[object Undefined]" console.log(toString.call(Symbol())); //=>"[object Symbol]" console.log(toString.call(BigInt(10))); //=>"[object BigInt]" console.log(toString.call({xxx:'xxx'})); //=>"[object Object]" console.log(toString.call([10,20])); //=>"[object Array]" console.log(toString.call(/^\d+$/)); //=>"[object RegExp]" console.log(toString.call(function(){})); //=>"[object Function]"
以上就是详解JavaScript数据类型和判断方法的详细内容,更多关于JavaScript数据类型和判断方法的资料请关注其它相关文章!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]