zweizhao.github.io

项目,文章,随笔,博客,Markdown,个人网站,人生感悟。

View on GitHub

JavaScript数据类型:Number、String、Boolean、Object、Null、Undefined,Symbol

类型
Number “number”
String “string”
Boolean “boolean”
Object “object”,本文不做讲解,数据结构篇具体描述
Null “object”,js历史遗留问题
Undefined “undefined”
Symbol “symbol”

数据类型

Number

就是常规的数字类型,包括整数与浮点数(简单理解成小数,分数也是小数表示)。

实例看代码:

// 计算
1 + 1 // 2
1 + 1.1 // 2.1

0 - 1 // -1
0 - 1.1 // -1.1

2 * 2 // 4,乘
2 * 2.2 // 4.4

2 / 2 // 1,除
2 / 2.2 // 0.9091
2 / 0 // Infinity,无穷大

3 % 2 // 1,取余
3.2 % 2// 1.2000,浮点坑

1 + 2 * 3 + 4 * (5 - 6) // 3,1 + 6 + 4 * (-1) => 7 + (-4) => 3,符合优先级

// 判断

typeof 1 // "number"
var a = 1
typeof a // "number"

务必注意浮点数处理,由于计算机保存浮点数使用的是二进制(计算机也只能用二进制),所以在浮点处理上会比较恶心,这里不做过多讲解,只是告诉你,浮点运算会有很多坑,建议能用整数就用整数,最后整理成浮点数。

比如,商品价格的设定,请使用分为单位,展示在页面上的时候使用分除以100就是元来表示,保存以及计算使用分,只有展示再使用元,千千万万不要保存成元!

关于浮点的坑:

1.1 + 1.1 + 1.1 // 3.3000000000000003

0.3 === 0.1 + 0.1 + 0.1 // false

String

字符串类型,当然也包含单个字符。简单理解,就是文字类型,与数字不同。

两种方式表达,”“与’‘,即被双引号包围起来与被单引号包围起来,二者可以混用,比如你一段文字里面引用了另一段文字。什么,你问我引入的文字又引入了一段文字?你,出去(请使用计算方式)。

// 表示
"我是字符串。"
'我也是字符串。'
"我套着一个'字符串'呢。"
'反过来"也行"呢。'

// 计算
"我是" + "风蓝小栖" // "我是风蓝小栖"
"我还是" + '风蓝小栖' // "我还是风蓝小栖"
'我也是' + '风蓝小栖' // "我也是风蓝小栖"
1 + '0' // "10",数字与字符串相加结果是字符串
1 + 1.1 + '0' // 2.10,计算顺序从左往右,所以不是11.10
1 + (1.1 + '0') // 11.10,优先级被改变,1 + "1.10" => "11.10"

// 判断
typeof '字符串' // "string"
var a = '字符串'
typeof a // "string"

Boolean

布尔类型,简单理解就是对错、真假、是否或0,1类型。

只有两个值,true与false,真与假,数字中非零即为真,具体如下:

// 表示
true // ...没什么好表示的
false // ... 一样

// 计算
true + true // 2,true计算转换为1,false为0
true + false // 1
false + false // 0
false + 1 // 1
false + '1' // "false1"混合计算当做字符处理

// 判断
typeof true // "boolean"
typeof false// "boolean"

看似没什么用处?不,布尔类型的用处非常大,因为我们业务中充满了各种逻辑,而布尔类型正是起源于逻辑,所以true与false主要就是用来逻辑判断,如下:

if(true) {
    console.log('真')
}

if(false) {
    console.log('假') // 不会执行
}

// 有个坑
true == 1 // true
true === 1 // false,见下面引用说明
true == 2 // false

if(1) {
    console.log(1)
}

if(2) {
    console.log(2) // 会打印,虽然上面说是false,但是记住,非0即为真
}

这里简单说一下==与===区别,==是指包含了隐式转换的对比,比如刚刚说了,true计算是1,所以true ==1可以看做 1 == 1,当然相等。但是,true === 1就不行了,因为 === 是指类型也要是一样,不存在隐式转换类型。

Null

只有一个值:null,表示空,没有对象,也没有值。可以用来清空数据。

// 坑
typeof null // "object",历史遗留问题,请务必注意。

// 计算
1 + null // 1,计算是把null当做0处理

// 判断
null == 0 // false
null + '0' // "null0",混合计算当做字符处理

// 清空数据
var a = 1
a = null

Undefined

未定义,与Null不同,Null表示没有,Undefined表示未定义,区别如下:

// 计算
undefined + 1 // NaN,undefined不会当做0处理,被当做NaN无效数字处理
null + 1 // 1,null是被当做0处理的

// 判断
typeof undefined // "undefined"
typeof null // "object"

var a // undefined,表示声明了没有定义,说明都没说明
var b = null // null,表示啥都没有,起码说明了
console.log(a) // undefined
console.log(b) // null
console.log(c) // c is not defined,报错

Symbol

ES6新出的数据类型,常用来作为唯一识别,类似字符串功能,但是具有唯一性。

// 计算
Symbol(1) + 9 // Cannot convert a Symbol value to a number,无法计算,无法转换成Number,哪怕是NaN也不行。
String(1) + 9 // "19",相当于"1" + 9
Symbol('1') === Symbol('1') // false,具有唯一性
String('1') === String('1') // true

// 判断
typeof Symbol(1) // "symbol",独立数据类型

由于具有唯一性,所以用来属性命名非常好,可以如下使用:

// 比如都想用key1做对象的键,如果别人也用会覆盖之前的值,那么使用Symbol就不会有这个问题
// 你的代码
var key = Symbol('key1')
var obj = {
    [key]: 'value1'
}
console.log(obj[key]) // 'value1'

// 别人或你自己后来追加
var key = Symbol('key1')
obj[key] = 'value1'
console.log(obj) // {Symbol('key1'): 'value1', Symbol('key1'): 'value1'},如果是字符串,后面会覆盖前面的,但是用的是Symbol就不会覆盖,和谐共存,后面遍历获取就可以都拿到了。

Object类型将在数据结构篇具体讲解,本篇不做讲解。


如果文章对你一点点的帮助,我就很开心了。

我是风蓝小栖如果喜欢我的文章,请关注一下呗,满满的都是干活。