ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、概述 ### **原始类型** * 数值(number):整数和小数(比如`1`和`3.14`); * 字符串(string):文本(比如`Hello World`); * 布尔值(boolean):表示真伪的两个特殊值,即`true`(真)和`false`(假); * Symbol(ES6引入):表示独一无二的值; ### **合成类型** * 对象(object):各种值组成的集合; ### **特殊值** * `undefined`:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值; * `null`:表示空值,即此处的值为空; ## 二、typeof JavaScript 有三种方法,可以确定一个值到底是什么类型; * `typeof`运算符 * `instanceof`运算符 * `Object.prototype.toString`方法 ~~~ typeof 123 // "number" typeof '123' // "string" typeof false // "boolean" ### 函数返回`function` function f() {} typeof f // "function" ### typeof 可以用来检查一个没有声明的变量 typeof undefined // "undefined" ### 对象返回`object` typeof window // "object" typeof {} // "object" typeof [] // "object" ### `null`返回`object` typeof null // "object" ~~~ ## 三、对象 ### 子类型 * 狭义的对象(object) * 数组(array) * 函数(function) ### 定义 简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合,大括号就定义了一个对象; ~~~ var obj = { foo: 'Hello', bar: 'World' }; ~~~ >[danger] > 1、对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以,如果键名是数值,会被自动转为字符串; > 2、对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用; > 3、如果属性的值还是一个对象,就形成了链式引用; > 4、属性可以动态创建,不必在对象声明时就指定; > 5、属性读取和赋值,可以用点运算符,也可以使用方括号运算符; > 6、所有属性查看:Object.keys; > 7、`delete`命令用于删除对象的属性,删除成功后返回`true`; > 8、属性是否存在:in 运算符; > 9、属性的遍历:for...in 循环; ### with语句 它的作用是操作同一个对象的多个属性时,提供一些书写的方便; ~~~ var obj = { p1: 1, p2: 2, }; with (obj) { p1 = 4; p2 = 5; } // 等同于 obj.p1 = 4; obj.p2 = 5; ~~~ ## 四、函数 ### 申明 (1)**function 命令** ~~~ function print(s) { console.log(s); } ~~~ (2)**函数表达式** ~~~ var print = function(s) { console.log(s); }; ~~~ (3)**Function 构造函数** ~~~ var add = new Function( 'x', 'y', 'return x + y' ); // 等同于 function add(x, y) { return x + y; } ~~~ ### 特点 可以把函数赋值给变量和对象的属性,也可以当作参数传入其他函数,或者作为函数的结果返回。函数只是一个可以执行的值,此外并无特殊之处; >[danger] JavaScript 语言将函数看作一种值,与其它值(数值、字符串、布尔值等等)地位相同。凡是可以使用值的地方,就能使用函数; ### 属性 name:函数的`name`属性返回函数的名字; length:函数的`length`属性返回函数预期传入的参数个数,即函数**定义**之中的参数个数; ### 方法 toString:函数的`toString()`方法返回一个字符串,内容是函数的源码; ### 参数 传值方式:函数参数如果是原始类型的值(数值、字符串、布尔值),传递方式是传值传递(passes by value);如果函数参数是复合类型的值(数组、对象、其他函数),传递方式是传址传递(pass by reference); arguments:arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用;虽然`arguments`很像数组,但它是一个对象。数组专有的方法(比如`slice`和`forEach`),不能在`arguments`对象上直接使用; ### 闭包 闭包简单理解成“定义在一个函数内部的函数”;闭包的最大用处有两个,一个是可以读取外层函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在; ### 函数表达式 函数定义后立即调用的解决方法; ### eval eval命令接受一个字符串作为参数,并将这个字符串当作语句执行;如果参数字符串无法当作语句运行,那么就会报错; ## 五、数组 ### 定义 简单说,数组(array)是按次序排列的一组值,整个数组用方括号表示;本质上,数组属于一种特殊的对象。`typeof`运算符会返回数组的类型是`object`;数组的特殊性体现在,它的键名是按次序排列的一组整数(0,1,2...); ### 特性 1、任何类型的数据,都可以放入数组; 2、于数组成员的键名是固定的(默认总是0、1、2...),因此数组不用为每个元素指定键名,而对象的每个成员都必须指定键名。JavaScript 语言规定,对象的键名一律为字符串,所以,数组的键名其实也是字符串。之所以可以用数值读取,是因为非字符串的键名会被转为字符串; 3、对象有两种读取成员的方法:点结构(`object.key`)和方括号结构(`object[key]`)。但是,对于数值的键名,不能使用点结构; ### 属性 length:返回数组的成员数量; in:检查某个键名是否存在的运算符`in`,适用于对象,也适用于数组; for...in:循环和数组的遍历; ### 空位 当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位(hole);