代码风格:
- 每句结尾不用加分号;
- 单行注释用//,多行注释用/*...需要注释掉的代码....*/
- 严格区分大小写
- 优雅的代码需要注意锁进
基础知识:
Number:JavaScript不区分整数和浮点数,统一用Number表示。十六进制用0x前缀和0-9,a-f表示。
字符串:以单引号'或双引号"括起来
\n
表示换行,\t表示制表符,字符
\
本身也要转义,所以\\
表示的字符就是\。多行字符串用反引号 ` ... ` 表示。
> `这是一个
多哈
字符串`
< "这是一个
多哈
字符串"
如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I,',m,空格,O,K这6个字符。
如果字符串内部既包含'又包含"怎么办?可以用转义字符\来标识,比如:
> 'I\'m OK!'
< "I'm OK!"
ASCII字符可以以\x##表示
十六进制
> '\x41'
< "A"
用\u####
表示一个Unicode字符
> '\u4e2d\u6587'
< "中文"
多个字符串连接起来,可以用'+变量+'
号连接。或者用 反引号`....${变量}...`和 连接。
> var name = '小米'
> var age = 20
> var message = '你好,'+name+',你今年'+age+'岁了'
> console.log(message)
[Log] 你好,小米,你今年20岁了
----------------------------------------------
> var name = '小米'
> var age = 18
> var message = `你好,${name},你今年${age}岁了!`
> console.log(message)
[Log] 你好,小米,你今年18岁了!
----------------------------------------
或者直接 "你好,"+name+",你今年"+age+"岁了"
var message = '你好,'+name+',你今年'+age+'岁了'
都可以。
> message.length
< 14
> message[0]
< "你"
> message[13]
< "!"
// undefined 超出范围的索引不会报错,但一律返回undefined
> message[14]
< undefined
字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果
> message[14] = 'kkk'
< "kkk"
> console.log(message)
[Log] 你好,小米,你今年18岁了!
字符串是不可变的.下面这些方法本身不会改变原有字符串的内容,而是返回一个新字符串
toUpperCase()
把一个字符串全部变为大写。
toLowerCase()
把一个字符串全部变为小写。
indexOf()
会搜索指定字符串出现的位置。
substring()
返回指定索引区间的子串。
match() 方法 查找字符串中特定的字符,并且如果找到的话,则返回这个字符。没找到返回null。ex: var str="Hello world!" ; str.match("world") 返回world
replace() 方法在字符串中用某些字符替换另一些字符。ex: var str="Visit Microsoft!"; str.replace("Microsoft","W3School") 返回Visit W3School!
> var test = 'Hello'
> test.toUpperCase()
< "HELLO"
> test.toLowerCase()
< "hello"
> var test1 = test.toUpperCase()
> console.log(test1)
[Log] HELLO
> console.log(test)
[Log] Hello
> var sTest = test+'hello'
> console.log(sTest)
[Log] Hellohello
> sTest.indexOf('llo')
< 2 //从索引2开始出现
> sTest.indexOf('HELLO')
< -1 // 没有找到指定的子串,返回-1
> sTest.substring(0,3)
< "Hel" // 从索引0开始到3(不包括3)
> sTest.substring(3)
< "lohello" //从索引3开始到结束,包括3
布尔值:
true
、false
比较运算符:
JavaScript允许对任意数据类型做比较。
false == 0; // true
false === 0; // false
要特别注意相等运算符==。JavaScript在设计时,有两种比较运算符:
第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。
由于JavaScript这个设计缺陷,不要使用==比较,始终坚持使用===比较。
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
另一个例外是NaN这个特殊的Number与所有其他值都不相等,包括它自己:
NaN === NaN; // false
唯一能判断NaN的方法是通过isNaN()函数:
isNaN(NaN); // true
最后要注意浮点数的相等比较:
1 / 3 === (1 - 2 / 3); // false
浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
null和undefined
null表示“空”,它和0以及空字符串''不同,0是一个数值,''表示长度为0的字符串。
用null表示一个空的值,而undefined表示值未定义。大多数情况下,用null。undefined仅仅在判断函数参数是否传递的情况下有用。
数组
两种创建方式。更多的用第二种
new Array(1, 2, 3); // 创建了数组[1, 2, 3]
var arr = [1, 2, 3.14, 'Hello', null, true]
arr[0]; // 返回索引为0的元素,即1
arr[5]; // 返回索引为5的元素,即true
arr[6]; // 索引超出了范围,返回undefined
要取得Array
的长度,直接访问length
属性。 arr.length; // 6
Array可以通过索引把对应的元素修改为新的值,因此,对Array的索引进行赋值会直接修改这个Array:
var arr = ['A', 'B', 'C'];
arr[1] = 99;
arr; // arr现在变为['A', 99, 'C']
请注意,如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化:
var arr = [1, 2, 3];
arr[5] = 'x';
arr; // arr变为[1, 2, 3, undefined, undefined, 'x']
arr.indexOf('A'); // 元素A的索引为0
arr.indexOf(30); // 元素30没有找到,返回-1
Array
也可以通过indexOf()
来搜索一个指定的元素的位置
slice()
就是对应String的substring()
版本,它截取Array
的部分元素,然后返回一个新的Array。
slice()
的起止参数包括开始索引,不包括结束索引。如果不给slice()
传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array。
push()
向Array
的末尾添加若干元素,pop()
则把Array
的最后一个元素删除掉。
往Array
的头部添加若干元素,使用unshift()
方法,shift()
方法则把Array
的第一个元素删掉。
sort()
可以对当前Array
进行排序,它会直接修改当前Array
的元素位置,直接调用时,按照默认顺序排序。
reverse()
把整个Array
的元素给反转。
splice()
方法是修改Array
的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素。单词英语意思:粘接
concat()
方法把当前的Array
和另一个Array
连接起来,并返回一个新的Array。
concat()
方法可以接收任意个元素和Array
,并且自动把Array
拆开,然后全部添加到新的Array
里。
join()
方法是一个非常实用的方法,它把当前Array
的每个元素都用指定的字符串连接起来,然后返回连接后的字符串。
多维数组:数组的某个元素又是一个Array
,则可以形成多维数组。
> var arr = ["B", "C", "D", "E", "F", "G"] ;
arr.sort(); //排序
arr;
< ["B", "C", "D", "E", "F", "G"]
> arr.reverse() //反转
< ["G", "F", "E", "D", "C", "B"]
> arr.splice(2,3,'s',2) //既删除又添加
> arr
< ["G", "F", "s", 2, "B"]
> arr.splice(2,2) //只删除,不添加
> arr
< ["G", "F", "B"]
> arr.splice(2,0,'a','b') //只添加,不删除
> arr
< ["G", "F", "a", "b", "B"] (5)
> var arr = ['A', 'B', 'C'];
var added = arr.concat([1, 2, 3]); //Arr
和另一个Array
连接,自动把Array
拆开,然后全部添加到新的Array
里。
arr;
< ["A", "B", "C"]
> added
< ["A", "B", "C", 1, 2, 3]
> added
< ["A", "B", "C", 1, 2, 3]
> added.join('-') //将数组元素连接返回字符串,如果Array
的元素不是字符串,将自动转换为字符串后再连接。
< "A-B-C-1-2-3"
> added[8] = null
> added.join('-')
< "A-B-C-1-2-3---"
>added[6] = '\x41'
> added.join('-')
< "A-B-C-1-2-3-A--"
对象
JavaScript的对象是一组由键-值组成的无序集合。
要获取一个对象的属性,我们用对象变量.属性名 或者 对象变量['属性名']的方式。
delete 属性
in 属性
toString 属性。toString
定义在object
对象中,而所有对象最终都会在原型链上指向object
,所以xiaoming
也拥有toString
属性
判断一个属性是否是xiaoming
自身拥有的,而不是继承得到的,可以用hasOwnProperty()
方法
> var xiaohong = {
name: '小红',
'middle-school': 'No.1 Middle School'
};
> xiaohong['middle-school'];//对象变量['属性名']
< "No.1 Middle School"
> xiaohong['name']; //对象变量['属性名']
< "小红"
xiaohong.name; //对象变量.属性名
< "小红"
> delete xiaohong.name //delete 属性--删除
> xiaohong
< {middle-school: "No.1 Middle School"}
> 'name' in xiaohong //in 属性,返回true或者false
< false
> 'middle-school' in xiaohong
< true
> 'toString' in xiaohong //toString 属性,true
< true
> xiaohong.hasOwnProperty('middle-school')
< true
> xiaohong.hasOwnProperty('toString')
< false
变量
变量名是大小写英文、数字、$
和_
的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,如if
、while
等。申明一个变量用var
语句。使用等号=
对变量进行赋值
strict模式(精确模式)
申明一个变量必须用var
语句。在strict模式下运行的JavaScript代码,强制通过var
申明变量,未使用var
申明变量就使用的,将导致运行错误。
启用strict模式的方法是在JavaScript代码的第一行写上:
'use strict'