这周在看 《Javascript 高级程序设计》小红书。
JS
基本语法
js是区分大小写的
每个语句 ;
隔开,语句块用{...}
;语句块具有缩进,通常是4个空格。
注释
//
、/* */
字符串
- length
var s = 'Hello world'
s.length // 11
s[1] // "e" 要获取字符串某个指定位置的字符,使用类似Array的下标操作,索引号从0开始:
JavaScript为字符串提供了一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串
toUpperCase()
把字符串全部变成大写
var s = 'hello wrold';
undefined
s.toUpperCase();
// "HELLO WROLD"
toLowerCase()
把字符串全部变成小写
-
indexOf()
返回下标缩影值, 找不到返回 -1
var s = 'hello wrold';
undefined
s.indexOf('wrold')
6
s.indexOf('h')
0
s.indexOf('m')
-1
-
substring()
返回指定索引区间的子串
var s = 'hello wrold';
undefined
s.substring(0,5) //从索引0开始到5(不包括5),返回'hello'
"hello"
s.substring(6) // 从索引6开始到结束,返回'world'
"wrold"
字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果
var s = 'hello wrold';
undefined
s[0] = 'H';
"H"
console.log(s) // hello wrold
-
split()
把一个字符串分割成一个字符串数组
var test = '2019-09-07';
undefined
test.split('-')
["2019", "09", "07"]
数组
和字符串一样 返回数组的长度,如果给 length 属性赋值,数组也会因此发生变化
var arr = [1, 2, 3.14, 'Hello', null, true];
undefined
arr.length //6
arr.length = 8
console.log(arr)
// [1, 2, 3.14, "Hello", null, true, empty × 2]
arr.length = 2;
console.log(arr)
// [1, 2]
数组可以通过索引把对应的元素修改为新的值,如果通过索引赋值时,索引超过了范围会引起数组的变化:
var arr = ['A', 'B', 'C'];
arr[0] = 99
console.log(arr)
// [99, "B", "C"]
arr[5] = 88
console.log(arr)
// [99, "B", "C", empty × 2, 88]
indexOf()
和字符串一样 通过元素来寻找对应的索引
slice()
截取数组的部分元素,返回一个新的数组
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var a = arr.slice(0,3) // 从索引0开始,到索引3结束但不包括索引3
var b = arr.slice(3) // 从索引3开始到结束且包括索引3
console.log(arr)
// ["A", "B", "C", "D", "E", "F", "G"]
console.log(a)
// ["A", "B", "C"]
undefined
console.log(b)
// ["D", "E", "F", "G"]
push() 和 pop()
push()向数组的末尾添加若干元素,pop()则把数组的最后一个元素删除掉
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
undefined
arr.push('v')
console.log(arr)
// ["A", "B", "C", "D", "E", "F", "G", "v"]
undefined
arr.pop()
console.log(arr)
// ["A", "B", "C", "D", "E", "F", "G"]
unshift() 和 shift()
往数组的头部添加若干元素,使用unshift()方法,shift()方法则把数组的第一个元素删掉
var arr = [1, 2];
arr.unshift(3,4,5)
5
console.log(arr)
// [3, 4, 5, 1, 2]
arr.shift()
3
console.log(arr)
// [4, 5, 1, 2]
sort()
可以对当前数组进行排序会直接修改当前数组的元素位置,直接调用时,按照默认顺序排序
var arr = ['B', 'C', 'A'];
arr.sort();
arr; // ['A', 'B', 'C']
reverse()
整个数组的元素给掉个个也就是反转
var arr = ['one', 'two', 'three'];
arr.reverse();
arr; // ['three', 'two', 'one']
splice()
修改Array的“万能方法”可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素
var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 从索引2开始删除3个元素,然后再添加两个元素:
arr.splice(2, 3, 'Google', 'Facebook'); // 返回删除的元素 ['Yahoo', 'AOL', 'Excite']
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
// 只删除,不添加:
arr.splice(2, 2); // ['Google', 'Facebook']
arr; // ['Microsoft', 'Apple', 'Oracle']
// 只添加,不删除:
arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因为没有删除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
concat()
可以接收任意个元素和数组且自动把数组拆开然后全部添加到新的数组里,不改变原来数组,返回一个新的数组
var arr = ['A', 'B', 'C'];
var s = arr.concat('d')
console.log(arr)
// ["A", "B", "C"]
console.log(s)
// ["A", "B", "C", "d"]
var b = arr.concat([1,2,3,4])
console.log(b)
// ["A", "B", "C", 1, 2, 3, 4]
join()
把当前数组的每个元素都用指定的字符串连接起来,然后返回连接后的字符串
var arr = ['A', 'B', 'C', 1, 2, 3];
var s = arr.join()
console.log(arr)
// ["A", "B", "C", 1, 2, 3]
console.log(s)
// A,B,C,1,2,3
typeof(s)
"string"
对象
JS的对象是一种无序的集合数据类型,它由若干键值对组成。JavaScript用一个 {...}
表示一个对象,键值对以xxx: xxx
形式申明,用,
隔开。注意,最后一个键值对不需要在末尾加,
,JavaScript对象的所有属性都是字符串,不过属性对应的值可以是任意数据类型,访问一个不存在的属性会返回什么呢?JavaScript规定,访问不存在的属性不报错,而是返回undefined
- 属性
访问属性是通过.
操作符完成的,但这要求属性名必须是一个有效的变量名
如果属性名包含特殊字符,就必须用''括起来:
var xiaohong = {
name: '小红',
'middle-school': 'No.1 Middle School'
};
xiaohong.middle-school //报错
xiaohong.name
"小红"
xiaohong['middle-school']
"No.1 Middle School"
可以给对象添加属性和删除属性
var xiaohong = {
name: '小红',
};
xiaohong.age = 18;
18
console.log(xiaohong)
// {name: "小红", age: 18}
delete xiaohong.name // 删除属性
console.log(xiaohong)
// {age: 18}
检测对象有没有某种属性
var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
'name' in xiaoming
true
'sex' in xiaoming
false
name in xiaoming
false
如果in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的
xiaohong
的属性名middle-school
不是一个有效的变量,就需要用''
括起来。访问这个属性也无法使用.操作符,必须用['xxx']
来访问,因为toString定义在object对象中,而所有对象最终都会在原型链上指向object,所以xiaoming也拥有toString属性。
要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法
var xiaoming = {
name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
'toString' in xiaoming; // true
- 有效变量名
条件判断
js 用 if () { ... } else { ... }
来进行条件判断
var age = 20;
if (age >= 18) { // 如果age >= 18为true,则执行if语句块
alert('adult');
} else { // 否则执行else语句块
alert('teenager');
}
- 多行条件判断
如果还要更细致地判断条件,可以使用多个if...else...
的组合
var age = 3;
if (age >= 18) {
alert('adult');
} else if (age >= 6) {
alert('teenager');
} else {
alert('kid');
}
循环
JavaScript的循环有两种,一种是for
循环 一种是for ... in
循环