javascript笔记(Day01)

1、javascript函数不介意传进来多少参数及其类型,函数中的参数在内部是用一个参数数组表示的,在函数体内可以通过arguments对象来访问参数数组,并且arguments对象内的值永远与命名参数的值保持同步,长度由传入的参数确定,不是定义函数时的命名参数的个数决定的。
在严格模式中,若存在命名参数,arguments不能更改命名参数的值。

function sexAlert(name, sex){
    console.log(name + ' is a ' + sex);
}
function sexAlert(){
    console.log(arguments[0] + ' is a ' + arguments[1]);
}

2、对象是按值传递的

function setName(obj){
    obj.name = 'yjm';
    obj = new Object();
    obj.name = 'cty';
    console.log(obj.name);//cty
}
const person = new Object();
setName(person);
console.log(person.name);//yjm

上述代码最后person.name值为yjm而不是cty,因为虽然在setName函数中重新将一个新对象赋值给obj,但是在函数执行完后局部对象就被销毁,所以值仍为yjm。而如果对象是按引用传递的,那在创建局部对象时,person就会自动指向新的obj,最后person.name就应该是cty。
3、数组赋值,索引大于原数组的长度时,会将数组的长度自动增加。

let arr = [1,2,3];
arr[99] = 100;
console.log(arr.length);//100

而在判断变量是不是数组时,instanceof适合单一全局执行环境。如果网页中存在两个框架(两个全局执行环境),将一个数组从一个框架传递到另一个时,ta和原生框架中创建的数组具有不同的构造函数。
对于这种情况,可以使用Array.isArray()方法。

if(Array.isArray(arr)){
    //进行某些操作
}

4、数组的迭代方法: every()和some(),foreach()和map(),filter(),传入三个参数,分别是数组每项的值,索引,数组本身。foreach()没有返回值,map()返回每次函数调用结果组成的数组。filter()对每一项运行函数,返回该函数会返回true的项所组成的数组。

const arr = [1,2,3,4,5,6,5,4,3,2,1];
//every
let everyResult = arr.every(function(item, index, array){
    return (item > 2);
});
console.log(everyResult);//false,每一项都满足条件才返回true
//some
let someResult = arr.some(function(item, index, array){
    return (item > 2);
});
console.log(someResult);//true,有一项满足条件就返回true
//filter
let filterResult = arr.filter(function(item, index, array){
    return (item > 2);
});
console.log(filterResult);//[3,4,5,6,5,4,3];
//map
let mapResult = arr.map(function(item, index, array){
    return item * 2;
});
console.log(mapResult);//[2,4,6,8,10,12,10,8,6,4,2];
//foreach
arr.foreach(function(item, index, array){
    //进行一些操作
});

5、缩小数组的函数reduce()和reduceRight()

const arr = [1,2,3,4,5];
let result1 = arr.reduce(function(prev, cur, index, array){
    return prev + cur;
});
console.log(result1);//15
let result2 = arr.reduceRight(function(prev, cur, index, array){
    return prev + cur;
});
console.log(result2);//15

5、函数申明和函数表达式的区别

console.log(myLoly());//sll
function myLoly(){
    return 'sll';
}
console.log(myYjm());//ReferenceError: myYjm is not defined
const myYjm = function(){
    return 'yjm';
};

6、callee与caller
callee是arguments对象的属性,指向拥有当前arguments对象的函数,
caller是函数的属性,保存着调用当前函数的函数的引用。可以使用arguments.callee,caller实现更松散的耦合。严格模式下,对函数的caller属性赋值会报错。

function outer(){
    inner();
}
function inner(){
    console.log(arguments.callee.caller);//outer函数
}
outer();

7、引用类型和基本包装类型的区别在于对象的生存周期。使用new操作符创建的引用类型的实例在执行环境退出当前作用域时才会被销毁,而基本包装类型只存在于一行代码的执行瞬间,这意味着我们不能在执行时为基本类型添加属性和方法。

let a = 'sll';
a,cty = 'zz';
console.log(a.cty);//undefined

而Object构造函数会根据传入值的类型返回相应的基本包装类型实例。

let a = new Object('sllzz');
console.log(a instanceof String);//true

你可能感兴趣的:(javascript笔记(Day01))