专栏首页csxiaoyaoECMAScript数据类型关系总结

ECMAScript数据类型关系总结

csxiaoyao对本节疑难点总结: 1. typeof 对于 null 值返回object,是历史遗留错误,现在 null 被解释为尚未存在的对象,但它仍是原始值 2. undefined:变量声明了未初始化赋予的值;null:尚未存在的对象;null == undefined 3. 未声明的变量使用除 typeof 以外的运算符会报错 4. ECMAScript 的 BooleanNumberString 的原始值是伪对象,实际上有属性和方法,如String有属性 length 5. String 是唯一没有固定大小的原始类型(行为与基本类型相似的不可变引用类型)

5 种原始类型

ECMAScript 有 5 种原始类型(primitive type),即 UndefinedNullBooleanNumberString

typeof 运算符

undefined - 如果变量是 Undefined 类型的 boolean - 如果变量是 Boolean 类型的 number - 如果变量是 Number 类型的 string - 如果变量是 String 类型的 object - 如果变量是一种引用类型或 Null 类型的

注释:null 值返回object,这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值

Undefined 类型

Undefined 类型只有一个值: undefined。当声明的变量未初始化时,该变量将被赋予默认值 undefined,即 undefined 类型的字面量

var oTemp;
alert(oTemp == undefined); //true
alert(typeof oTemp); //undefined
alert(typeof oTemp2); //undefined
function testFunc() {
}
alert(testFunc() == undefined); //true 函数无明确返回值返回 undefined

注释:typeof 运算符不区分 undefined 和未定义值(都输出undefined,实际是两种不同的值),若对 oTemp2 使用除 typeof 之外的其他运算符会引起错误 只有 typeof 才能用于未声明的变量

Null 类型

Null类型只有一个字面量值 null,值 undefined 实际上是从值 null 派生的,因此 ECMAScript 把它们定义为相等

alert(null == undefined);  //true

Boolean 类型

Boolean 类型有两个字面量值:true 和 false

Number 类型

Number 类型既可表示 32 位的整数,也可表示 64 位浮点数 尽管所有整数都可表示为八进制或十六进制的字面量,但所有数学运算返回的都是十进制结果 定义浮点值字面量,必须包括小数点和小数点后的一位数字(1.0 而不是 1) 浮点字面量进行计算前,真正存储的是字符串 特殊的 Number 值:Number.MAX_VALUE、Number.MIN_VALUE、Number.POSITIVE_INFINITY、Number.NEGATIVE_INFINITY、Infinity、NaN 计算生成的数 > Number.MAX_VALUE 时将被赋予值 Number.POSITIVE_INFINITY 即 Infinity 计算生成的数 < Number.MIN_VALUE 时将被赋予值 Number.NEGATIVE_INFINITY 即 -Infinity 调用isFinite() 方法,确保数值不是无穷大

if (isFinite(iResult)) {
    alert("finite");
}

NaN(Not a Number)一般发生在类型(String、Boolean 等)转换失败时

alert(NaN == NaN);  //false

isNaN() 判断是否是非数

alert(isNaN("blue"));  //true

String 类型

String 是唯一没有固定大小的原始类型

类型转换

—>String

ECMAScript 的 Boolean、Number、String 的原始值是伪对象,实际上有属性和方法

toString()

ECMAScript 定义所有对象(包括伪对象和真对象)都有 toString() 方法,即使String原始值(伪对象)也有 Boolean:”true” 或 “false” Number:有两种模式(默认模式和基模式) 默认模式用相应的字符串输出十进制数字值(整数、浮点数、科学计数法)

var Num = 10.0;
alert(Num.toString()); // "10" 而非 "10.0"

基模式进行进制转换

alert("10".toString(16));   // "A"

—>Number

parseInt()parseFloat() 把非数字的 String 类型原始值转换成数字,其他类型调用返回 NaN

parseInt()

首先查看位置 0 处的字符,如果不是有效数字返回 NaN,如果是有效数字,继续向后查看直到发现非有效数字的字符为止,把该字符之前的字符串转换成数字

var iNum = parseInt("12345red");    //返回 12345
var iNum = parseInt("0xA"); //返回 10
var iNum = parseInt("56.9");    //返回 56,对整数来说,小数点是无效字符
var iNum = parseInt("red"); //返回 NaN
var iNum = parseInt("10", 8);//返回 8

parseFloat()

parseFloat() 方法的不同之处在于字符串必须以十进制形式表示浮点数,没有基模式

var fNum1 = parseFloat("12345red"); //返回 12345
var fNum2 = parseFloat("0xA");  //返回 NaN
var fNum3 = parseFloat("11.2"); //返回 11.2
var fNum4 = parseFloat("11.22.33"); //返回 11.22
var fNum5 = parseFloat("0102"); //返回 102 忽略前导 0
var fNum1 = parseFloat("red");  //返回 NaN

强制类型转换

Boolean(value) - 把给定的值转换成 Boolean 型 Number(value) - 把给定的值转换成数字(可以是整数或浮点数) String(value) - 把给定的值转换成字符串

Boolean() 函数

true:非空字符串、非 0 数字、对象 false:空字符串、0、undefined、null

//false
var b1 = Boolean(""); // - 空字符串
var b1 = Boolean(null); // - null
var b1 = Boolean(0); // - 0
//true
var b1 = Boolean("hello"); // - 非空字符串
var b2 = Boolean(50); // - 非零数字
var b1 = Boolean(new object()); // - 对象

Number() 函数

与 parseInt() 和 parseFloat() 方法的处理方式相似,只是转换的是整个值,而不是部分值 如果字符串值能被完整地转换,Number() 将判断调用 parseInt() 方法还是 parseFloat() 方法

Number(false)   0
Number(true)    1
Number(undefined)   NaN
Number(null)    0
Number("1.2")   1.2
Number("12")    12
Number("1.2.3")     NaN
Number(new object())    NaN
Number(50)   50

String() 函数

只需调用作为参数传递进来的值的 toString() 方法,和调用 toString() 方法的唯一不同之处在于,对 null 和 undefined 值强制类型转换可以生成字符串而不引发错误

var s1 = String(null);  //"null"
var oNull = null;
var s2 = oNull.toString();  //会引发错误

== 自动转换规则

number:string ( string —> number) null:undefined ( == ) boolean:? ( boolean —> number ) number/string:object ( number/string —> object)

Object 类型

Object 对象具有下列属性: 1. constructor 对创建对象的函数的引用(指针)。对于 Object 对象,该指针指向原始的 Object() 函数。 2. Prototype 对该对象的对象原型的引用。对于所有的对象,它默认返回 Object 对象的一个实例。

Object 对象具有下列方法: 1. hasOwnProperty(property) 判断对象是否有某个特定的属性。必须用字符串指定该属性。(例如,o.hasOwnProperty(“name”)) 2. IsPrototypeOf(object) 判断该对象是否为另一个对象的原型。 3. PropertyIsEnumerable 判断给定的属性是否可以用 for…in 语句进行枚举。 4. ToString() 返回对象的原始字符串表示。对于 Object 对象,ECMA-262 没有定义这个值,所以不同的 ECMAScript 实现具有不同的值。 5. ValueOf() 返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。

instanceof 运算符

instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型

var oStringObject = new String("hello world");
console.log(oStringObject instanceof String);   //true
console.log(typeof oStringObject);  //object

Boolean 对象

Boolean 对象是 Boolean 原始类型的引用类型

Number 对象

Number 对象是 Number 原始类型的引用类型 要得到数字对象的 Number 原始值,只需要使用 valueOf() 方法

var oNumberObject = new Number(68);
var iNumber = oNumberObject.valueOf();

String 对象

String 对象是 String 原始类型的对象表示法

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ECMASCript 2019可能会有哪些特性?

    为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

    Fundebug
  • 运行 Confluence 6 在 SSL 配置后的 NGINX

    我们假定你已经运行了 NGINX 实例。如果你还没有安装运行 NGINX 实例,请参考 NGINX documentation 文档中的内容来下载安装 NGIN...

    HoneyMoose
  • JavaScript中的iterable类型(Map,Set,Array三种)的遍历方法for in;for of;forEach的用法区别

    遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于i...

    acoolgiser
  • 前端模块化杂记 前言AMD/CMD简介Commonjs简介Module简介Common和Module的区别Module与webpackModule与Babel一些问题总结引用

    前端模块化在近几年层出不穷,有Node的CommonJs,也有属于client端的CMD/AMD模式,而ES6本身也出现了Modules,再加上Webpack以...

    菜的黑人牙膏
  • 【ES基础】let和作用域

    ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)以JavaScript为基础制定的一种脚本语言标准。目前,该标准基本上每年发布一次新的ES...

    前端达人
  • React Native 生命周期

             在面向对象编程中,任何对象的存在都会存在生命周期。类似我们iOS 的View,就会有LoadView,ViewWillAppear,ViewD...

    ZY_FlyWay
  • JavaScript中的Map与Set键值对象的用法

    JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结构,即一组键值对。

    acoolgiser
  • 还在纠结JS代码风格? Google给你你答案了!

    Google 和 Airbnb 是目前最流行的 JavaScript 代码风格,如果你长期使用 JavaScript 来写代码的话,建议对比看看。

    Jean
  • React 总结初稿一

    18 年转眼即逝,不同寻常的一样。这一年我毕业了,入坑前端。工作只用 vue ,自己又学了 react , TypeScript ,小程序,这些在工作中从未用到...

    sunseekers
  • 【ES6基础】const介绍

    在ES6之前,JavaScript被其他编程语言诟病没有定义常量的能力,甚至在大多数企业的开发文档中,对于常量的定义都使用var。一般经常会使用大写字母和下划线...

    前端达人

扫码关注云+社区

领取腾讯云代金券