JS中6种简单数据类型和1种复杂数据类型

前言:ECMAScript有6种简单的数据类型(也称为原始类型):Undefined、Null、Boolean、Number、String和Symbol。Symbol(是ECMAScript6新增的)。还有一种复杂数据类型叫Object(对象)。

1.Typeof操作符

Typeof是一种来确定任意变量的数据类型,对一个值使用typeof操作符会返回下面字符串之一
"Undefined"表示值未定义
"Boolean"表示值为布尔值
"String"表示值为字符串
"Number"表示值为数值
"Object"表示值为对象(而不是函数)或null
"function"表示值为函数
"Symbol"表示值为符号
注意:typeof在某些情况下返回的结果可能会让人费解,但技术上讲还是正确的。比如,调用typeof null 返回的是"Object"。这是因为特殊值null被认为是一个对空对象的引用

2.Undefined类型

Undefined类型只有一个值,就是特殊值undefined。但使用var或let声明变量但没有初始化时,就相当于给变量赋予了 undefined值

  let message;
  console.log(message == undefined); //true
  //上面的代码就等同于下面的代码形式
  let message = undefined;
  console.log(message == undefined); //true
  //这里,变量message显式地以 undefined 来初始化。但是这是没有必要的,因为默认情况下,任何为初始化的变量都会取得 undefined值

注意:包含undefined值的变量跟未定义变量是有区别的

 let message; //这个变量被声明了,但为初始化值为undefined
 let sex; //假设这个没有声明过
 console.log(message); //undefined
 console.log(sex); // 报错

在对未初始化的变量调用 typeof时,返回的结果是"undefined",但对未声明的变量调用它时,返回的结果还是"undefined",无论是声明还是未声明,typeof返回的都是字符串"undefined"。逻辑上讲这是对的,因为虽然严格来讲这两个变量存在根本性差异,但它对任何一个变量都不可能执行真正的操作

3.Null类型

Null 类型同样只有一个值,即特殊值null。逻辑上讲,null值表示一个空对象指针,这也是给typeof传一个null会返回"Object"的原因

 let car = null;
 console.log(typeof car); //Object

undefined值是由null值派生而来的,因此ECMA—262将他们定义为表面上相等,如下面所示

console.log(undefined == null); //true

4.Boolean类型

*Boolean(布尔值)类型是ECMAScript中使用最频繁的类型之一,有两个字面值:true和false。这两个布尔值不同数值,因此true不等一1,false不等于0。布尔值字面量 true 和 false 是区分大小写的,因此True 和 False(及其他大小混写形式)是有效的标识符,但不是布尔值
虽然布尔值只有两个,但所有其他ECMAScript类型的值都有相应布尔值的等价形式。要将一个其他类型的值转换为布尔值,可以调用特定的Boolean()转型函数

 let message = "Boolean类型";
 let messageBool = Boolean(message);
 //message 会被转换为布尔值并保存在变量 messageBool中。Boolean()转型函数可以在任意类型的数据上调用,而且始终返回一个布尔值。下表总结了不同类型与布尔值之间的转换规则
数据类型转换为true的值转换为false的值
Booleantruefalse
String非空字符串" "(空字符串)
Number非零数值(包括无穷值)0、NaN
Object任意对象null
Undefined不存在undefined

4.Number类型

ECMAScript中最有意思的数据类型或许就是Number 了。Number类型使用IEE 754格式表示整数和浮点值(双精度值)不同的数值类型相应地也有不同的数值字面量格式

 //1.最基本的数值字面量格式十进制整数
 let intNumber = 24; // 整数
 //2.八进制的字面量,第一个数字必须是零(0)
 let octintnumber1 = 070; //八进制的56
 let octintnumber2 = 079; //无效的八进制,当成79处理;
 let octintnumber3 = 08; //无效的八进制,当成8处理
 //3.十六进制字面量,前缀必须是 0x(区分大小写)
 let hexnumber1 = 0xA; //十六进制10
 let hexnumber2 = 0x1f; //十六进制的31
 //4.浮点型,小数后面必须至少有一个数值,小数点前面不是必须有整数,但建议加上
 let floatnumber1 = 1.1;
 let floatnumber2 = 0.1;
 let floatnumber3 = .1; //(不推荐这样的写法)
 let floatnumber4 = 1.; //小数点后面没有数字,当成1来处理
 let floatnumber5 = 10.0; // 小数点后面有零,当成整数10处理

5.String类型

String(字符串)数据类型表示零或多个16位Unicode字符序列。字符串可以使用双引号( " )、单引号( ’ )、或反引号( ` )

 let firstnum = "John";
 let lastnum1 = 'jacab';
 let lastnum2 = `johnjacab`;
 let firtname = 'Nicholse"; // 语法错误:开头和结尾的引号必须同一种

字符字面量:

字面量含义
\n换行
\t制表
\b退格
\r回车
\f换页
\\反斜杠(\)
\'单引号( ’ )
\"双引号( " )
\`反引号( ’ )
\xnn以十六进制编码nn表示的字符(其中n是十六进制数字0~F),例如console.log('\x41'); 等于"A"
\unnnn以十六进制编码nnnn表示的Unicoe字符(其中n是十六进制数字0~F),例如:console.log('\u03a3');等于希腊字符"Σ"

这些字符字面量可以出现在字符串中的任意位置,且可以作为单个字符被解释

let text = "This is the letter sigma: \u03a3.";
console.log(text.length); // 28
//如果字符串中包含双字节符,那么length属性返回的值可能不是准确的字符数

6.Symbol类型

Symbol(符号)是ECMAScript6 新增的数据类型。符号是原始值,且符号实例是唯一、不可变的符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。下面讲述一下Symbol(符号)的一些基本使用

 //符号需要使用Symbol()函数初始化。因为符号本身是原始类型,所以typeof操作符对符号返回symbol
 let sym = Symbol();
 console.log(typeof sym); //symbol
 //调用Symbol()函数时,也可以传入一个字符串参数作为对符号的描述,将来可以通过这个字符串来调试代码。但是,这个字符串参数与符号定义或标识完全无关
 let gener = Symbol();
 let other = Symbol();
 let fooSymbol = Symbol('foo');
 let otherFooSymbol = Symbol('foo');
 console.log(gener == other); //false
 console.log(fooSymbol == otherFooSymbol); //false
 //符号没有字面量语法,这也是它们发挥作用的关键。按照规范,你只要创建Symbol()实例并将其用作对象的新的属性,就可以保证它不会覆盖已有的对象属性,无论是符号属性还是字符串属性
 let gener = Symbol();
 console.log(gener); //Symbol()
 let fooSymbol = Symbol('foo');
 console.log(fooSymbol); //Symbol(foo)
 //最重要的是,Symbol()函数不能用作构造函数,于new关键字一起使用。像Boolean、String或Number那样,它们都支持构造函数且可用于初始化包含原始值的包装对象
 let myBoolean = new Boolean();
 console.log(typeof myBoolean); //"object"
 let myString = new String();
 console.log(typeof myString); //"object"
 let myNumber = new Number();
 console.log(typeof myNumber); //"object"
 let mySymbol = new Symbol();
 console.log(typeof mySymbol); //TypeError: Symbol is not a constructor
 //如果你确实想使用符号包装对象:可用借用Object()函数。
 let mySymbol = Symbol();
 let mywrappedSymbol = Object(mySymbol);
 console.log(typeof mywrappedSymbol); //"object"

6.Object类型

ECMAScript中的对象其实就是一组数据和功能的组合。对象通过new操作符后跟对象类型的名称来创建。开发者可以通过创建Object类型的实例来创建自己的对象,然后在给对象添加属性和方法

 let o = new Object();
 let o = new Object; //合法,但不推荐
 //Object的实例本身并不是很有用,但理解与它相关的概念非常重要。

因为在ECMAScript中Object是所有对象的基类,所以任何对象都有这些属性和方法。
严格来讲,ECMAScript中对象的行为不一定适合JavaScript中其他的对象。比如浏览器环境中的BOM和DOM对象,都是有宿主环境定义和提供的宿主环境。而宿主对象不受ECMA-262约束,所以它们可能会也可能不会继承Object

今天就到这里了,有什么不对的,可以在评论中说出来,大家一起讨论。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值