JavaScript Syntax introduction
JavaScript syntax introduction:
mode :
'use strict'
(严格模式)打印 :
console.log()
比较运算符 :
===
NaN : not a number, 判断NaN的方法通过
isNaN()
函数null 和 undefined : null 表示“空”的值, undefined 表示值未定义,仅仅在判断函数参数是否传递的情况下有用
for ... in
循环:var o = {
name: 'Jack',
age: 20,
city: 'Beijing'
};
for (var key in o) {
console.log(key); // 'name', 'age', 'city'
}对象 :由一组键-值组成的无序集合,用
{}
表示, 其中 键 必须是字符串var person = {
name: 'Bob',
age: 20,
tags:['js', 'web', 'mobile'],
city: 'beijing',
hasCar: true,
zipcode: null
}
person.age = 18;
delete person.school; //删除一个不存在的school属性也不会报错
delete person.zipcode;//删除zipcode属性
person.school = 'qinghua'; //新增一个school属性
'toString' in person; // true;
//因为toString定义在object对象中,而所有对象最终都会在原型链上指向object,所以person也拥有toString属性
hasOwnProperty(); //判断一个属性是否是xiaoming自身拥有的,而不是继承得到的
Array: 可包含任意数据类型
var arr = [1, 2, 3.14, 'Hello', null, true];
- 通过索引来访问每个元素
- length属性
- indexOf() : 返回索引
- slice() :
slice()
就是对应String
的substring()
版本,它截取Array
的部分元素,然后返回一个新的Array
- push() 和 pop() :
push()
向Array
的末尾添加若干元素,pop()
则把Array
的最后一个元素删除掉 - unshift 和 shift : 如果要往
Array
的头部添加若干元素,使用unshift()
方法,shift()
方法则把Array
的第一个元素删掉 - sort() : 可以对当前Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序
- reverse() : 反转
array
- splice() : 修改
Array
的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素 - concat() : 把当前的
Array
和另一个Array
连接起来,并返回一个新的Array
- join() : 非常实用的方法,它把当前
Array
的每个元素都用指定的字符串连接起来,然后返回连接后的字符串
Map : 一组键值对的结构,具有极快的查找速度。
var m = new Map([['Michael', 95],['Bob', 75],['Tracy',85]]);
m.get('Michael');初始化
Map
需要一个二维数组,或者直接初始化一个空Map
。Map
具有以下方法:var m = new Map();
m.set('Adam', 67);
m.get('Adam');Set :
Set
和Map
类似,也是一组key
的集合,但不存储value
。由于key
不能重复,所以,在Set
中,没有重复的key
var s1 = new Set();
var s2 = new Set([1,2,3]);
iterable类型 : 包含
Array
,Set
,Map
, 可使用for ... of
语法for ... in
循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array
数组实际上也是一个对象,它的每个元素的索引被视为一个属性。
当我们手动给Array对象添加了额外的属性后,for … in循环将带来意想不到的意外效果:for ... of
只循环集合本身的元素.var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
console.log(x); // '0', '1', '2', 'name'}
var b = ['A', 'B', 'C'];
b.name = 'Hello';
for (var x of b) {
console.log(x); // 'A', 'B', 'C'}forEach使用
;
// Array :
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array)) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
console.log(element + ', index = ' + index);
}
//set :
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
console.log(element);
});
//Map :
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
console.log(value);
});
** function:**
function abs(x) { |
function指出这是一个函数定义;
abs是函数的名称;
(x)括号内列出函数的参数,多个参数以,分隔;
{ … }之间的代码是函数体,可以包含若干语句,甚至可以没有任何语句。
** arguments:**
只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array
使用:
arguments.length
== 2 , 参数个数为2时;
** rest 参数:**
function foo(a, b, ...rest) { |
** variable scope:**
由于JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量
全局作用域:不在任何函数内定义的变量就具有全局作用域。实际上,JavaScript
默认有一个全局对象window
,全局作用域的变量实际上被绑定到window
的一个属性
; |
以变量方式
var foo = function () {}
定义的函数实际上也是一个全局变量,因此,**顶层函数 ** 的定义也被视为一个全局变量,并绑定到window
对象
; |
每次直接调用的
alert()
函数其实也是window
的一个变量:
; |
JavaScript实际上只有一个全局作用域。
任何变量(函数也视为变量),如果没有在当前函数作用域中找到,就会继续往上查找,最后如果在全局作用域中也没有找到,则报ReferenceError错误。
** 命名空间:**
全局变量会绑定到window上,
不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现。
减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。例如 :
// 唯一的全局变量MYAPP: |