第3章 基本概念(下)

来源:互联网 发布:小米电视3s 知乎 编辑:程序博客网 时间:2024/06/09 18:43

3.4 数据类型

ECMAScript 中有5种简单数据类型(也称基本数据类型):Undefined、Null、Boolean、Number 和 String。1种复杂数据类型:Object,Object 本质上是由一组无序的名值对组成的(ECMAScript 不支持任何创建自定义类型的机制)。ES6 Symbols 也是一个集

A、typeof 操作符

typeof 操作符返回一个字符串,指示未经过计算的操作数的类型

类型

结果Undefined"undefined"Null"object"Boolean"boolean"Number"number"String"string"Symbol(ECMAScript 6)symbol宿主对象(由JS 环境提供)Impementation-dependent函数对象function任何其他对象object
// Numbertypeof 37 === 'number';typeof Math.LN2 === 'number';typeof Infinity === 'number';typeof NaN === 'number';//Stringstypeof ""==='string';typeof "hello" === 'string';//Booleanstypeof true === 'boolean';//Symbols (ES6)typeof Symbols() === 'symbols';//Undefinedtypeof undefined === 'undefined';//Objecttypeof {a:1} === 'object';//functiontypeof function(){} === 'function';

B、Symbol(ES6)

Symbol 是一种特殊的、不可变的数据类型,可作为对象属性的标识符使用。

symbol 数据类型是一个 primitive data type(原始数据)

注:primitive data type (原始值、原始数据类型)不是一种object 类型并且没有自己的方法。在JavaScript 有6种数据类型:string、boolean、number、null、undefined、symbol

Symbol("symbol1") === Symbol("symbol1"); //false
注:Symbol("symbol1")不会强制字符串 “symol1” 成为一个symbol,它每次都会创建一个新的symbol

C、undefined

全局属性undefined原始值undefined。Undefined 类型只有一个值,即特殊的undefined。使用var 声明但未对其加以初始化时,这个变量的值就是undefined。

//未初始化var messsage;message == undefined; //true//初始化var message = undefined;message == undefined; //true//区别var message1;message2;alert(message1); //undefinedalert(message2); //error
严格相等和undefined(使用undefined的严格相等或不想等来决定变量是否拥有值)
var x;if(x === undefined){//执行这些语句}else{//这些语句不会被执行}

D、Null

值null 是一个JavaScript 字面量,表示空值(null or an “empty” value),即没有对象呈现(no object value is present)。Null 类型是第二个只有一个值的数据类型。null 是一个字面量(字面量是常量,其值是固定的,而且在程序脚本运行中不可更改)

null 与 undefined 的区别

E、Boolean

Boolean 类型是ECMAScript 中使用最多的一种类型,该类型只有两个字面值:true 和false 。

数据类型转化为true 的值转化为false 的值BooleantruefalseString任何非空字符串""(空字符串)Number任何非零数字值(包括无穷大)0 或 NaNUndefinedn/a (not applicable,不适用)undefined

//if 语句,自动执行相应的Boolean 转换var message = "hello";if(message){//true 的内容}


<script>// new Boolean() 是对象var x = new Boolean(false);if(x){// 代码会被执行}var x = false;if(x){//代码不会被执行}var x = Boolean(expression); //正确var x = new Boolean(expression); //错误;这是对象// 如果对象作为初始化值,那么该值对象值为false的Boolean 对象,生成的Boolean 对象值为truevar myFalse = new Boolean(false); //初始化值为falsevar g = new Boolean(myFalse); //初始化值为true //创建一个Boolean 函数,初始化值为falsevar a = Boolean();var a = Boolean(0);var a = Boolean(null);var a = Boolean("");var a = Boolean(undefined);var a = Boolean(false);</script>

F、Number

JavaScript 的Number 对象是经过封装处理数字值的对象,Number 对象由Number() 构造器创建

// 最基本的数值字面量格式是十进制var intNum = 55; //整数// 八进制字面值第一位必须是零(0),如果字面值的数值超出范围,那么前导就会忽略,后面数值被当作十进制解析,严格模式下八进制是无效的var octalNum1 = 070; //八进制 56var octalNum2 = 079;  //无效八进制,十进制 79var octalNum3 = 08; //无效八进制,十进制 8// 十六进制前两位必须是 0xvar hexNum1 = 0xA; //十六进制 10var hexNum2 = 0x1f; //十六进制 31
注:在进行算数计算时,所有八进制和十六进制表示的数值最终都将转换为十进制数值;正零(+0)和负零(-0)相等

a、浮点数值

浮点数值就是该数值中必须包含一个小数点,并且小数点后面必须至少有一个数字。

var floatNum1 = 1.1;var floatNum2 = 0.1;var floatNum3 = .1; //有效,但不推荐小数点前面没有整数


保存浮点数需要的内存空间是保存整数值的两倍(ECMAScript 会不失时机地将浮点数转为整数)
var floatNum1 = 1.; //小数点后面没有数字,解析为 1var floatNum2 = 10.0; //整数,解析为10
对于极大数或极小输,用e(科学计数法)表示(6个零以上)
var floatNum1 = 3.125e7; //3125000var floatNum2 = 3e-7; // 0.0000003

浮点数的最高精度是17位小数,进行算术计数时他的精度远远不如整数


b、数值范围

由于内存有限,ECMAScript 并不能保存世上所有数值。最小值保存在Number.MIN_VALUE,能够表示最大值保存在Number.MAX_VALUE,超出范围将自动转换位特殊的 Infinity 值


如果返回Infinity ,那么该值将无法进行下一次运算。可用isFinite() 函数,在极小值或者极大值之间会返回true

c、NaN

NaN,即非数值(Not a Number)是一个特殊的数值(用于表示一个本来要返回数值的操作数未返回数值的情况,这样就不会抛出错误)

// 任何设计NaN 的操作都会返回NaN// NaN 与任何值都不想等,包括它本身// isNaN() 函数确认参数“不是数值”,任何不能转换为数值的值返回trueNaN == NaN; //falseisNaN(NaN); //true isNaN(10); //flase,10是一个数值isNaN("10"); //false,可以转换为数值10isNaN("blue"); //true,stringisNaN("true"); //flase,true=1
d、数值转换

Number() 可用于任何数字类型、parseInt()(字符串转成数值)、parseFloat() (字符串转成数值)可用于任何数字类型可以把非数值转换为数值

// Number() 函数的转换规则Number(true); //1Number(false); //0Number(01000); //1000Number("01000"); //1000Number(null); //0Number(undefined); //NaNNumber("hello"); //NaNNumber(0x15); //21,16进制转为十进制
//parseInt() 函数解析一个字符串参数,并返回一个指定技术的整数//语法 parseInt(string,radix)//永远要明确给出radix 参数的值parseInt("F",16); //15parseInt("15",8); //15parseInt("15",10); //15parseInt("FXX23",16); //15parseInt("15*3",10) //15parseInt("hello",10) //NaNparseInt("532",2); //NaNparseInt(100.23); //100
//parseFloat() 只解析十进制parseFloat("0xA"); //0parseFloat("100.23.1"); //100.23parseFloat("1000.22"); //100.22

e、String

String 类型用于表示由零或多位16位Unicode 字符串组成的字符串序列,即字符串。

//转换为字符串//toString() 方法//null 返回null//undefined 返回 undefinedvar num=10;num.toString(); //字符串10var found=true;found.toString(); //true//调用数值的toString() 方法时,可以传递一个参数var num=10;num.toString(); //10num.toString(2); //1010num.toString(8); //12num.toString(16); //a

G、操作符

ECMA-262 描述了一组用于操作数据的操作符,包括算术操作符(如加号和减号)、位操作符、关系操作符和相等操作符。

a、一元操作符

// 递增和递减操作符// 布尔值false = 0 ,true = 1;var num1 = 20, num2=10, num3=false;var num4 = {valueOf:function(){return -5;}}var a = num1 + num2++console.log(num2) // 11console.log(a) //30var b = ++num2 + num1console.log(num2); //12console.log(b); //32console.log(++num3); //1console.log(++num4); //-4// 一元加和减操作符// (+)放在数值前,对数值不会产生任何影响;(-)主要用于表示负数var num1=10, var num2 = true+num1 = 10;  -num1 = -10; +(-num1)=-10; -(-num1)=10-num2 = -1; num2=1;

B、位操作符

位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。ECMAScript 中的所有数值都以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值。而是先将64位的值转换为32位的正数,然后执行操作,最后再将结果转换回64位。对于开发人员来说,由于64位存储格式是透明的,因此整个过程就像是只有在32位的整数一样。

对于有符号位的整数:第32位0表示正数,1表示负数。

正数以纯二进制格式存储;负数同样以二进制码存储,但使用的格式是二进制补码