2.3 数据结构
typeof 操作符
- typeof 操作符返回一个字符串,表示未经计算的操作数的类型
- 数字类型
- 包括整型数字和浮点型数字
- 整型:十进制、十六进制(0X或0x开头)、八进制(ECMAScript标准不支持,严格模式下不支持)
- 浮点型:3.1 .666 1.23e11 // 1.23 * 1011 2.321E-12 // 2.321 * 10-12
let a = 10; let b = 1.2; let c = 2.1E-2; console.log(typeof a); // number console.log(typeof b); // number console.log(typeof c); // number
- 字符串类型
- 由单引号或双引号括起来的一组16位Unicode字符组成的字符序列
- 转义字符:
\n \r \"
等 - 查阅String文档
- 字符串模板
- 允许嵌入表达式的字符串字面量
- 使用反引号 (``键盘数字1左边) 来代替普通字符串中的用双引号和单引号
- 字符串模板保留其中的换行,可以包含特定语法(${expression})的占位符
var a = 5; var b = 10; console.log("Fifteen is " + (a + b) + " and\nnot " + (2 * a + b) + "."); var a = 5; var b = 10; console.log(`Fifteen is ${a + b} and not ${2 * a + b}.`); // "Fifteen is 15 and // not 20."
- 布尔类型
- true false a==1
- 进行算术操作时,true转换为1,false转换为0
var b = true; console.log(typeof b); // boolean console.log(true * true); // 1 * 1 = 1
- null与undefined
- null表示空或不存在的引用,参与算术运算时自动转换为0,布尔运算时转换为false
- undefined表示变量已声明但没有赋值,布尔运算时转换为false,出现的典型情况:
- 变量声明后没有赋值
- 调用函数时,应提供的参数未提供
- 对象的属性没有赋值时
- 数组定义后没有给元素赋值,元素的值
- 函数没有返回值,默认返回值
- 对象类型
- 类似与Java语言中的对象,数据+处理数据的函数,数据称为对象的属性,函数称为对象的方法
- 内置对象:window document Date Math等等
- 自定义对象
- 数组(Array)是一种内置对象
- typeof 返回值都是object
- 函数类型
- 有名函数,函数名称为函数变量;匿名函数赋值于某变量后,该变量为函数变量
- 函数变量的值为整个函数定义语句
let fn1 = function() { console.log('调用fn1'); } let fn2 = () => { console.log('调用fn2'); } function fn3() { console.log('调用fn3'); } console.log(typeof fn1); // function console.log(typeof fn2); // function console.log(typeof fn3); // function console.log(fn1); // function() { console.log('调用fn1'); } console.log(fn2); // () => { console.log('调用fn2'); } console.log(fn3); // function fn3() ... ...
- 数据类型转换 ——加号(+)
- 加号(+)两边存在字符串或引用类型时,加号为字符串连接符,非字符串操作数自动转换为字符串,引用类型调用其toString()方法转换为字符串。
console.log("我是" + 2019 + "级学生"); // "我是2019级学生" console.log("15" + 5); // 155 console.log("abc" + true + 1); // abctrue1 console.log("abc" + null + 2); // abcnull2 console.log(true + 1 + "abc"); // 2abc console.log(null + 2 + "abc"); // 2abc console.log("abc" + function() {console.log('a')}); // abcfunction(){console … … console.log({name: '张三'} + 1); // [object Object]1 console.log({name: '张三', toString: function(){return '人员' + this.name}} + 1); // 人员张三1 console.log(1 + function() {console.log('a')}); // function() {console.log('a')}
- 加号(+)两边为数值、布尔、null或undefined类型时,加号为加法算术操作符,此时非数值操作数自动转换为数值型,若存在不能转换为数值的操作数(仅有undefined),结果为NaN。
console.log(true + 1); // 2, 1 + 1 console.log(undefined + 1); // NaN console.log(null + 2); // 2, 0 + 2 console.log(true + 1 + “abc”); // 2abc,true与1间的加号为算术加法,其结果(2)与“abc”间连接字符串 console.log("abc" + 2 + null); // abc2null
- 数据类型转换 ——其它操作符
- 减(-)、乘(*)、除(/)、取余(%)两边存在字符串时,字符串自动转换为数字(如有无法转换操作数,则结果为NaN)
- ++和--,字符串自动转换为数字,无法转换的结果为NaN
console.log("20" / 2); // 10 console.log("20" / "2"); // 10 console.log("20" - "a"); // NaN let n = "6"; let s = "a"; console.log(++n); // 7 console.log(++s); // NaN let a = true; console.log(++a); // 2
>、<、==、<=、>=
:表达式包含数字和字符串时,字符串自动转换为数字,不能转换成数字的字符串或其它类型值,表达式均返回false- 当比较两个字符串的大小时,按ASCII码比较,比较true false null 的大小时,按值比较( true=1, false=null=0)
console.log("10" > 9); // true console.log("a" > 0); // false console.log("a" <= 0); // false console.log(true > 0); // true console.log(null < 1); // true console.log(undefined < 1); // false
- 相等与严格相等
- == 左右两边的值相等即返回true,数据类型可不相同
- === 左右两边的值相等,且数据类型相同,返回true
- != 和 !== 与以上类似,其区别在数据类型是否相同
console.log('15' == 15); // true console.log('15' === 15); // false console.log(true == 1); // true console.log(false == 0); // true console.log(true === 1); // false
- 显式类型转换
- Number(value) 全局函数,对value进行整体转换,value中包含无法转换为数字的部分时,转换失败,返回NaN
- parseInt(stringNum, [radix])全局函数,将stringNum转换为整数,radix为2-36之间的数字,指定转换时进制,进制为10时可省略
- parseFloat(stringNum)全局函数,将stringNum转换为浮点数
- ... 扩展运算符(对象展开符)
- 扩展运算符( spread )是三个点(...),其作用是将一个数组转为用逗号分隔的参数序列
- 常用于函数调用时传递参数
扩展运算符提供了数组合并的新写法。注:Array.concat()方法用于连接两个数组