一、语言细节和技巧
1、typeof、null 和 undefined
typeof 操作符来检测变量的数据类型。
null 表示 "什么都没有"的空值,undefined 表示没有设置值。
2、数据类型转换
(1) 通过使用 JavaScript 函数
(2) 通过 JavaScript 自身自动转换
3、正则表达式
语法: /正则表达式主体/修饰符(可选)
修饰符包括: i(大小写忽略)、g(全局匹配)、m(多行匹配)。
常用方法: search() 和 replace()。
4、提升(Hoisting)
变量提升: 变量的声明将被提升到作用域的最顶部,注意只有声明会被提升而定义不会被提升。
函数提升: 函数的声明/定义将被提升到作用域的顶部。
5、严格模式(use strict)
作用: 消除代码运行的一些不安全之处,保证代码运行的安全;提高编译器效率,增加运行速度;为未来新版本的Javascript做好铺垫。
严格模式下新增关键字: implements、interface、let、package、private、protected、public、static、yield。
6、JavaScript内置对象、属性和方法
Array | Date | eval | function | hasOwnProperty |
Infinity | isFinite | isNaN | isPrototypeOf | length |
Math | NaN | name | Number | Object |
prototype | String | toString | undefined | valueOf |
7、this关键字
在方法中,this 表示该方法所属的对象。
如果单独使用,this 表示全局对象window。
在函数中,this 表示全局对象window。(在函数中在严格模式下,this 是未定义的(undefined)。)
在事件中,this 表示接收事件的元素。
8、let和const
ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const。
let 声明的变量只在 let 命令所在的代码块内有效,它实际上增加了全局作用域和函数局部作用域外的代码块作用域。
const 声明一个只读的常量,一旦声明,常量的值就不能改变。
9、void
void关键字指定要计算一个表达式但是不返回值。
比如 javascript:void(0) 没有意义。
二、JavaScript函数
1、函数定义
使用函数声明: function myfunc(a, b) { return a*b; }
使用函数表达式(匿名函数): var myfunc = function (a, b) { return a*b; }
使用Function()构造函数: var myfunc = new Function("a", "b", "return a*b")
2、函数参数
显式参数(Parameters,即形参)、隐式参数(Arguments,即实参)。
函数定义显式参数时没有指定数据类型。函数对隐式参数没有进行类型检测,对隐式参数的个数没有进行检测。
ES5 中如果函数在调用时未提供隐式参数,参数会默认设置为:undefined 。
ES6 支持函数带有默认参数。
JavaScript 函数有个内置的对象 arguments 对象,它包含了函数调用的参数数组。
JavaScript 隐式参数通过值来传递: 函数仅仅只是获取值,隐式参数的改变在函数外不可见。
3、函数调用
作为全局函数调用,此时this指向的是window对象。
作为对象方法调用,此时this指向的是对象。
使用构造器new来调用函数,将会生成一个新的函数对象,此时this不指向任何值。
通过函数对象的call()和apply()两个方法来调用,它们都需要将对象作为第一个参数,此时的this指向的是第一个参数值。
4、闭包
函数可以访问局部变量,也可以访问全局变量;当函数与函数内嵌时,内嵌函数能访问外部函数的局部变量,也可以访问全局变量。
在函数内部创建函数对象,该函数对象就可以访问外层函数的局部变量。
将这个内部创建的函数对象返回,只有通过它才能操作外层函数的私有局部变量,这种机制就是闭包。
三、JavaScript对象
1、对象基础
JavaScript中没有类这个概念,相似的概念就是对象,对象也有继承的概念。(for...in遍历对象时将会遍历对象的属性)
JavaScript 中的所有事物都是对象,对象具有属性和方法;所有的 JavaScript 对象都会从一个 prototype(原型对象)中继承属性和方法。
创建对象有三种方法:
(1) var obj = new Object(); obj.name = "java"; obj.color = "red";
(2) var obj = {name: "java", color: "red"};
(3) 对象构造器: function func(name, color) { this.name = name; this.color = color} | var obj = new func("java", "red");
JavaScript对象手册: https://www.runoob.com/jsref
2、Number对象
属性: MAX_VALUE、MIN_VALUE、NEGATIVE_INFINITY、POSITIVE_INFINITY、NaN、prototype、constructor。
方法: toExponential()、toFixed()、toPrecision()、toString()、valueOf()。
3、String对象
属性: length、prototype、constructor。
方法: charAt()、charCodeAt()、concat()、fromCharCode()、indexOf()、lastIndexOf()、match()、replace()、
search()、slice()、split()、substr()、substring()、toLowerCase()、toUpperCase()、valueOf()。
4、Boolean对象
在逻辑判断中,这些值将会认定为false: 0、-0、null、""、false、undefined、NaN。
属性: prototype、constructor。
方法: toString()、valueOf()。
5、Array对象
使用var x = new Array(); 来创建,不同数组下标所指向的可以是不同类型的对象。
属性: length、prototype、constructor。
方法: concat()、...、toString()、valueOf()。
6、Date对象
属性: prototype、constructor。
方法: getDate()、...、toString()、valueOf()。
7、Math对象
属性: E、LN2、LN10、LOG2E、LOG10E、PI、SQRT1_2、SQRT2
方法: abs(x)、...、sqrt(x)、tan(x)。
8、RegExp对象
属性: global、ignoreCase、lastIndex、multiline、source、constructor。
方法: compile()、exec()、test()、toString()、search()、match()、replace()、split()。