文章目录
对象类型
- 属性名可以是数字,或者有空格的字符串。这些特殊的属性都会被转为字符串。这种属性访问时不能用点运算符,只能用中括号
var person = {
5:12,
'my age': 10
}
person["my age"] //10
person["5"] //12
person[5] //12
数组
-
利用数组的length可以在数组尾部增加值
var arr = ["apple", "banana"]; arr[arr.length] = "orange"; console.log(arr); // [ 'apple', 'banana', 'orange' ]
-
检测数组
instanceof
isArray()
:instanceof
假定的是单一的全剧环境。假如一个页面有多个框架,那么不同框架的Array构造函数也会不同。isArray()
解决的就是,不管来自哪个全局环境,都只判断某个值是不是数组
-
转换方法
toString()
: 返回由数组中每个值的字符串形式拼接而成的一个以逗号分割的字符串
toLocaleString()
: 返回由数组中每个值的字符串形式拼接而成的一个以逗号分割的字符串
valueOf()
: 返回的还是数组var arr = [true, "banana"]; console.log(arr.toString()); console.log(arr.toLocaleString()); console.log(arr.valueOf()); /* true,banana true,banana [ true, 'banana' ] */
join('||')
: 以参数作为分割符连接数组中的元素 -
栈
push()
: 在尾部加入任意个元素,返回新长度pop()
:在尾部删除最后一个元素,返回这个元素
-
队列
push()
shift()
:在头部删除第一个元素,返回这个元素
-
相反队列
pop()
unshift()
:在头部加入任意个元素,返回新长度
-
排序方法
reverse()
: 将数组元素顺序倒置sort(function)
:若没有指定function,则将所有元素使用toString()
转化后进行字符串比较(字典序)
-
操作方法
-
concat()
: 创建当前数组的一个副本,将参数加入到副本的末尾。参数不管是单个值还是数值,最后都会抽取出单个值加入。 新数组和原数组相互独立。var arr = [true, "banana"]; arr2 = arr.concat("orange", ["black", "pink"]); console.log(arr2) // [ true, 'banana', 'orange', 'black', 'pink' ]
-
slice
:按左闭右开切分出原数组的一部分。新数组和原数组相互独立。若参数为负数,则用数组长度加上负数作为切分位置。var arr = [true, "banana", "orange"]; arr2 = arr.slice(0,1) console.log(arr2) // [ true ]
-
splice(index, num, a, b, ....)
: 从index开始删除num个元素,并插入a, b, … 若num为零,则单纯为插入,若没有a, b … 则单纯为删除。
-
-
查找方法
indexOf(ele, 【start】)
: 从start开始左到右查找ele所在的下标。lastIndexIOf(ele, 【start】)
: 从start开始右到左查找ele所在的下标。
-
迭代方法
arg: function(item, index, array) {}
every(arg)
: 对数组中的每一项运行函数,若每一项都返回true,则返回truefilter(arg)
:对数组中的每一项运行函数,返回该函数返回true的值组成的数组forEach(arg)
:对数组中的每一项运行函数,没有返回值map(arg)
:对数组中的每一项运行函数,返回调用结果组成的数组some(arg)
:对数组中的每一项运行函数,若有一项返回true,则返回true
var numbers = [1, 2, 3, 4, 5, 6] console.log( numbers.every((item, index, array)=>{ return item > 2; }) ) //false console.log( numbers.some((item, index, array) => { return item > 2; }) ) //true numbers.forEach((item, index, array)=> { item = item + 1 }) console.log(numbers) //[ 1, 2, 3, 4, 5, 6 ] /* 此处原数组的值并没有改变。原因可见上一章关于函数的笔记。 item 作为 函数的参数传进去,都是按值传递的,因此改变item并不会改变原数组的值。 但假如原数组中的元素是引用型,传进参数的就是这个对象在堆内存中的地址, 因此作属性改变时,改变会作用到原对象 */ console.log( numbers.filter((item, index, array)=>{ return item > 2; }) ) //[ 3, 4, 5, 6 ] console.log( numbers.map((item, index, array)=> { return item + 1; }) )//[ 2, 3, 4, 5, 6, 7 ]
-
缩小方法
reduce
reduceRight()
reduce(function(prev, curr, index, array){ return value; })
每次迭代取数组中的两个值,将返回值作为下一次迭代的
prev
Date类型
- 创建:
new Date()
: 无参数则创造当前时间,有参数则内部调用parse - 根据字符串生成date:
Date.parse()
RegExp
字面量形式:
var expression = /pattern/flags
使用构造函数形式:
var expression = new RegExp("pattern", "flag")
使用构造函数形式,参数为string,因此对于一些转义字符,要进行双重转义
flags:
- g:全局
- i:不区分大小写
- m:多行
方法:
exec()
为捕获组而设计。参数:要应用模式的字符串。返回值:一个数组。数组的第一个元素是与整个模式匹配的字符串,其他项是与捕获组相匹配的字符串。一个捕获组即模式中用括号包起来的部分
引用自
test()
:测试某个字符串是否符合模式
Function
函数声明和函数定义
Js中解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问),而函数表达式,则需要等到解析器执行到它所在的代码行,才会真正被解释执行。
函数作为参数
应用场景:hbxEat()
中不论调用什么Eat()
函数,都需要附带hbx
这个值
function hbxEat(eat, foodnum) {
var name = "hbx";
var left = eat(foodnum);
console.log(name + " eat and left " + left );
}
function eatapple(applenum) {
console.log("original apple: " + applenum);
applenum--;
return applenum;
}
function eatpear(pearnum) {
console.log("original pear: " + pearnum);
pearnum--;
return pearnum;
}
var apple = 10;
var pear = 5;
hbxEat(eatapple, apple);
hbxEat(eatpear, pear);
/*
original apple: 10
hbx eat and left 9
original pear: 5
hbx eat and left 4
*/
函数作为返回值
闭包:
- 保存局部变量
arguments
每个函数都有一个arguments
类数组对象,保存所有的参数
arguments使用
function eat(somefood) {
for (let arg of arguments) {
console.log("eat " + arg);
}
}
eat("apple", "pear", "tomato");
/*
eat apple
eat pear
eat tomato
*/
附:for...in, for...of, forEach
方法辨析引用
forEach()
:不能中断,只能用于array
for...in
:可以中断,只能用于”enumerable“对象
for...of
:可以用于“很多“对象
对于map
,for...in
遍历的是key
,for...of
遍历的是value
function eat(somefood) {
console.log(arguments);
for (let arg in arguments) {
console.log("eat " + arg);
}
}
eat("apple", "pear", "tomato");
/*
[Arguments] { '0': 'apple', '1': 'pear', '2': 'tomato' }
eat 0
eat 1
eat 2
*/
callee
arguments
对象还有一个属性callee
,指向本函数。用处:在递归时去除函数与函数名耦合。
去耦合例子
function factorial(num) {
if (num <= 1) {
return 1;
}
else {
return num * arguments.callee(num-1);
}
}
caller
每个函数都有一个属性caller,指向调用本函数的函数。当函数是全局函数时,这个值为null
function outer() {
inner();
}
function inner() {
console.log(inner.caller);
}
outer();
//[Function: outer]
this
指的是当前函数执行的环境对象(不是指这个函数)。当在函数的全局作用域调用这个函数时,指的是window
call & apply
改变函数执行的环境对象(this)
apply(this, arguments | [])
call(this, a1, a2, a3)
可以实现对象和方法的解耦
bind
创建一个this确定的函数
functionA = functionB.bind(objectC)
length
函数属性length,返回函数期望获得的参数个数
基本包装类型
String,Boolean,Number。这些类型是对基本类型的包装,封装了一些方法,成为一个对象。
var s1 = "absd";
var s2 = s1.substring(2);
console.log(s2);
执行过程:
- 将s1基本类型封装成String类型,
- 使用substring方法
- 销毁该包装类型
String
一些常用的方法
trim()
:创建一个字符串的副本,删除前置和后置的所有空格,然后返回结果。toLowerCase() / toUpperCase()
:大小写转换indexOf()
:查找子串的位置concat()
:连接slice(start, end) / substring(start, end)
:生成子串,不影响原串length()
:长度
Global对象
兜底儿对象。不属于任何其他对象的属性和方法,都是他的属性和方法。
Math对象
- Math.ceil():向上舍
- Math.floor():向下舍
- Math.round():标准舍