JS 包含三部分
核心ECMASCRIPT
DOM
BOM
JS 注释
- 单行注释
// 被注释的这一行,它不会被执行
- 多行注释
/* 注释多行 */
注 \n 在js文本中(弹框等)的换行,JavaScript 会忽略多余的空格。您可以向脚本添加空格,来提高其可读性
JS 三种弹框
alert
(“弹出框”)confirm
(“提示信息”) 返回值为true
或false
prompt
(“提示信息”,”默认值”) 点击确定返回输入的字符串
JS 输出
document.write() document.writeln()
输出之后会加空格,如果在文档已完成加载后执行document.write
,整个HTML
页面将被覆盖consloe.log()
控制台输出信息console.time(1)
code console.timeEnd(1)
用来标记循环耗时console.table(obj)
将json对象按表格输出
JS 变量
- 以字母 下划线
$
开头 不能由数字开头 不能使用关键字 - 对大小写敏感(
age
和AGE
是不同的变量)
当给变量分配文本值时,应该用双引号或单引号包围这个值。
当给变量赋的值是数值时,不要使用引号.如果用引号该值会被作为文本来处理 - 声明多个变量用逗号隔开
(var a,b,c)
- 声明变量的时候没有给它赋值。只是声明,没有管它,没有给它赋值。
var name;
alert(name); //会弹出undefined;
变量存放在栈里 键盘上的字符,数字,特殊符号放在常量池 对象放在堆里面 - 局部变量会在函数运行以后被删除 全部变量会在页面关闭后被删除
JS 数据类型 (es6之前)
- 基本数据类型
一number
数值型infinity
无穷大数字10/0 infinity
二string
字符串 必须用引号引起来
三bool
布尔型true和false
布尔值直接使用 千万不要加上引号
四function
函数
五undefined
未定义 - 复合数据类型
六object
对象null 对象{} 数组[]
注意问题
1
2
3
4
5
6null 没有这个对象或无值(空) 通过给一个变量赋 null 值来清除变量的内容
undefined 有声明而未赋值的变量
null==undefined; //true
isNaN()判断是否是NaN(判断之前先用Number()转换)
NaN 不是一个数字 但是它是number数字型
NaN 和 NaN 自己不相等 是布尔值false显式类型转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29一 Number() 转换成数值型
ex:var a = '110'
var b = Number(a)
console.log(b) // 110
console.log(typeof b) //number
ex:var a = '110px'
var b = Number(a)
console.log(b) //NaN 不是一个数字
console.log(typeof b) // number
Number("")-->0 Number(null)-->0 Number([])-->0
注:空字符串 空数组和null 进行Number()转换时 返回0
对象 函数 undefiend 使用Number()时 都为NaN
当数组有且只一个元素,而这个元素是数值时 Number()转换成该数值
数组不是一个元素时不管是什么Number()转换都是NaN
二 parseInt() 强制取整 parseFloat() 转换成小数
parseInt(b,10) //第二个参数表示进制
对字符串或数组的第一个字符进行判断,不是数字字符将停止转换
除了加号/空格/减号(负数)外的任何非数字都将得到NaN)
ex:var a = '100px';
var b = parseInt(a);
console.log(b); //100
console.log(typeof b);//number
当数组第一个元素是数字parseInt()或parseFloat()将数组第一个元素转换成数字
ex:console.log(Number(['a'])) //NaN
console.log(Number([2,'2',2])) //NaN
console.log(Number(['2'])) //2
console.log(parseInt(["2",3,4])) //2
console.log(parseInt(['a',2])) //NaN
三 转换为布尔值 Boolean(变量) 或 !!变量隐式类型转换
①+(拼接) //100 + '1' => '1001'
变字符串
②- * / % ++ -- // '100'-2 => 98
变数字
③> < // (var a='10')<(var b=4)
转换成布尔值 会用number转换
④字符串比较大小时 比较第一个字符的ASCII码
⑤!取反
把右边的数据类型转换成布尔值
JS 运算符
算术运算符
+ - * / % ++ --
++ --
自增或自减 不支持布尔型 对于字符串自增或自减属于升序或降序a++或a--
先用(赋值)再加 结果不变 加不加()运算结果都一样++a或--a
先加再用(赋值) 结果加1或减11
2
3
4
5
6
7
8var a = 1
// 无论是否加括号都是 先执行 3 + a 然后在 a进行自增 a+1
// console.log(3 + a++) // 4 a => 2
console.log(3 + (a++)) // 4 a => 2
var m = 1
// 无论是否加括号都是 先执行 m自增 m+1 然后在和3相加
// console.log(3 + ++m) // 5 m => 2
console.log(3 + (++m)) // 5 m => 2赋值运算符
= += -= *= /= %=
把右边的值赋给左边的变量或常量- 比较运算符
< > <= >= == != === !==
比较运算符的结果都是一个布尔型
恒等于===
值和类型都相同 非恒等于!==
数值不相等或类型不相同==
和!=
在比较之前首先让双方的值做隐士类型转换
在简单基本比较运算符中 值和引用都要一样 - 逻辑运算符
and
或&&
逻辑与 当两边都为true
时,才返回true
,否则返回false
or
或||
逻辑或 只要有一个为true
时,返回true
,都为假时才返回false
xor
逻辑异或 当两个操作数一个为真一个为假时,才返回true
!
逻辑非 单一操作数为true
,则返回false
- 位运算符
对二进制位从低位到高位对齐后进行计算&
按位与|
按位或^
按位异或~
按位取反<<
向左移位>>
向右移位注: 按位运算不会出现短路
三元运算符(条件运算符)
表达式1?表达式2:表达式3
如果表达式1为真则执行表达式2,表达式1为假则执行表达式31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26一. 在取模%运算符中 正负号取决于被除数的正负
ex: var a = 5,b = -2
console.log(a%b) //1
ex: var a = -5,b = -2;
console.log(a%b) //-1
在js中拼接用"+" 从左往右碰到第一个非数值之后就理解为字符串拼接
在JS中任何类型的值都可以转换成逻辑布尔值
假 ""(空字符串) null undefined false NaN 0为假,其他都为真
真 函数 对象 非空字符串 非0的数字 数组 true都为真
注:在js中逻辑运算符(短路) 返回的是最早能判断表达式结果的那个值
二. 对于&& 如果第一个值是false 则整个表达式都是false 并返回第一个值。
如果第一个值是true 则直接返回最后一个值不管真假
三. 对于|| 如果第一个值是false 则看后面的条件是否为真,找到真值就将其返回
如果到最后也没找到真值,则返回最后一个值。
如果第一个值是真就直接返回第一个
ex var a = false
var b = 6
var c = true
var d = a || b && c
console.log(d) //true
ex var a = false
var b = 6
var c = null
var d = a && b || c
console.log(d) //null
四. void取消返回值delete
删除对象的属性或数组中的元素
删除数组元素时,并没有改变数组的长度,只是留下了一个undefined
的值1
2
3
4
5ex: delete obj.a delete obj["a"] delete array[0]
var arr = [1, 2]
delete arr[1] //true
console.log(arr) //[empty, 2]
arr.length //2逗号表达式
一般形式是:表达式1,表达式2,表达式3……表达式n
逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。
最后整个逗号表达式的值是表达式n的值。 看下面几个例子:1
2
3
4
5x = 8 * 2, x * 4 /*整个表达式的值为64,x的值为16*/
(x = 8 * 2, x * 4), x * 2 /*整个表达式的值为128,x的值为16*/
x = (z = 5, 5 * 2) /*整个表达式为赋值表达式,它的值为10,z的值为5*/
x = z = 5, 5 * 2 /*整个表达式为逗号表达式,它的值为10,x和z的值都为5*/
// 逗号表达式用的地方不太多,一般情况是在给循环变量赋初值时才用得到in
运算符in
运算符它的左操作符是一个字符串或可以转化为字符串,右操作符是一个对象。如果右侧的对象拥有一个 名为左操作数值的属性名,那么表达式返回true1
2
3
4
5
6
7
8ex:var point = { x:1, y:1 }
"x" in point // true
"z" in point // false 对象不存在z属性
"toString" in point // true 对象继承了toString方法
var data = [ 7,8,9 ]
"0" in data // true 数组包含"0"属性
1 in data // true 数字转换为字符串
3 in data // false 没有索引为3的元素typeof
运算符(es6之前)
返回表示操作数类型的字符串typeof(xx)
typeof xx
1
2
3
4
5
6
7typeof(undefined) // "undefined"
typeof(null) // "object"
typeof(1.2) // "number"
typeof(NaN) // "number"
typeof('字符串') // "string"
typeof(function fn(){}) // "function"
typeof({}) // "object"
JS 语句
条件控制语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39// if语句
if (expr(真或假)) {
statement
}
// 只有一条语句时,大括号可以省略
if(expr) statement
// if...else语句
if (expr) {
statement
} else {
statement
}
// if...elseif语句
if (expr1) {
statement1
} else if (expr2) {
statement2
} else {
statement3
}
// switch...case语句
switch(变量){
case 值1:
statement1
break
case 值2:
statement2
break
case 值3:
statement3
break
default:
statement
}
a. switch(变量) 变量的类型只能是数字或字符串
b. case中值的判断必须是 === 类型和数值都得相等
c. switch case 适合单个值匹配 elseif 适合判断范围时使用
d. break是退出switch使用的,如果需要同时匹配多个值可以使用多个case而不加break
e. default无论放在开始还是结束,不会影响程序执行,先执行case 在执行 default 放在末尾可以不加break 放在开头必须加break循环控制语句 用于遍历对象或数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// while循环语句
// 表达式为true时 才执行循环体
while(expr){
statement;
}
// for语句
for(expr1;expr2;expr3){
statement;
}
// expr1变量的初始赋值,expr2为循环条件,expr3为变量递增或递减
// 用于已知循环次数多条件循环操作
// do...while循环语句
// 先执行循环体,在判断表达式,成立再执行循环体
do {
statement
} while(expr)
// for...in 循环语句 遍历对象所以可枚举的属性(enumerable)
for(var key in json){
console.log(key+'-->'+json[key]);
}跳转控制语句 常用于跳出
for
循环或foreach
循环break
语句break n
指定要跳出几层循环 结束整个循环结构continue
语句continue n
指定要跳出几层循环 只能终止本次循环 继续下一层循环
JS中的保留字
1 | break catch case continue do default delete debugger else false |
JS运算符优先级
1 | // 优先级 由高到底 |
JS 定时器
1 | // 设置定时器 (目前最小时间14毫秒) |
JS 小知识
定时器有多个参数, 返回值
timer
是整数数字1
2
3
4var timer = setTimeout(function(num){
console.log(num) // 123
}, 1000, 123)
console.log(timer) // 61834利用
\
进行多行字符串的拼接1
2
3obj.innerHTML='<div>这行</div>\
<span>文字</span>\
<p>标签</p>'console.log('%c'+带样式得输出,'font-size:50px;color:red')
可以输出样式,图片等typeof写法 typeof arr等价于typeof(arr) 还有instanceof和in
嵌套for循环跳出循环
1
2
3
4
5
6
7
8
9for(var i = 0; i < 5; i++){ a:for(var i = 0; i < 5; i++){
for(var j = 0;j < 1; j++){ for(var j = 0; j < 1; j++){
if(i == 3){ if(i == 3){
break; break a
} }
console.log(i) console.log(i)
//0 1 2 4 //0 1 2
} }
} }call(obj) 改变this指向 不写参数 默认指向window
obj.getBoundingClientRect() 获取元素上下左右宽高6个值
- 元素尺寸:对应
jQuery
中的$(xx).outerWidth()
和$(xx).outerHeight()
方法,包括padding
和border
,也就是元素的border-box
的尺寸。在原生DOMAPI
中对应的是offsetWidth
和offsetHeight
,所以,有时候也称为元素偏移尺寸
。 - 元素内部尺寸:对应
jQuery
中的$(xx).innerWidth()
和$(xx).innerHeight()
方法,表示元素的内部区域尺寸,包括padding
但不包括border
,也就是元素的padding-box
尺寸。在原生的DOM API
中
对应clientWidth
和clientHeight
,所以,有时候也称为元素可视尺寸
。 - 元素外部尺寸:对应
jQuery
中的$(xx).outerWidth(true)
和$(xx).outerHeight(true)
方法, 表示元素的外部尺寸,不仅包括padding
和border
,还包括margin
,也就是元素的margin-box
尺寸。
没有相对应的原生的DOMAPI
JSON
json
是存储和传输数据的格式用于服务器端向网页传递数据json
英文全称JavaScript Object Notation
json
格式仅仅是一个文本,文本可以被任何编程语言读取及作为数据格式传递
json
语法规则1
2
3
4
5
6
7
8
9
10
11
12a.数据为键/值对 "firstName":"John" // 属性名最好加上双引号
b.并列数据由逗号分隔 "firstName":"John", "lastName":"Doe"
c.大括号保存对象 {"firstName":"John", "lastName":"Doe"}
d.方括号保存数组 "employees":[{"firstName":"John", "lastName":"Doe"}]
var arr={"employees":[
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]}
// JSON取值
arr.employees[0].firstName //John
arr["employees"][0].firstName //JohnJson
遍历for in
(不能使用for循环),json
是没有长度的,json.length
会得到undefined
1
2
3
4
5
6
7
8
9var json1 ={
'url':['img/1.jpg','img/2.jpg','img/3.jpg','img/4.jpg'],
'text':['这是第一张图片','这是第二张图片','这是第三张图片','这是第四张图片']
}
for(var attr in json1){
for(var i=0;i<json1[attr].length;i++){
console.log(json1[attr][i])
}
}json
字符串转换为javascript
对象1
2
3
4
5
6
7
8
9
10// 创建javascript字符串字符传为JSON格式的数据
var txt='{"employees":['+
'{"firstName":"John", "lastName":"Doe"},'+
'{"firstName":"John", "lastName":"Doe"},'+
'{"firstName":"John", "lastName":"Doe"}]}';
// 使用JSON.parse() 将json字符串转换为javascript对象
var obj = JSON.parse(txt)
// 获取值并输出
console.log(obj.employees[1].firstName+"--"+obj.employees[1].lastName)
console.log(obj["employees"][2].firstName+"--"+obj["employees"][2].lastName)