1.null 和 undifined 的区别
null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN。 null表示”没有对象”,即该处不应该有值
(1) 作为函数的参数,表示该函数的参数不是对象。 (2) 作为对象原型链的终点。
undefined表示”缺省值”,就是此处应该有一个值,但是还没有定义
(1)变量被声明了,但没有赋值时,就等于undefined。 (2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。 (4)函数没有返回值时,默认返回undefined
2. js 数据类型
js 基本数据类型:number, boolean, string, null, undefined
引用数据类型:数组,对象,函数
基本数据类型存储:栈 引用数据类型存储:栈存指针,堆放对象
赋值和浅拷贝的区别:
赋值只是复制地址,改变数值对象,原对象也改变。 浅拷贝复制一层,即改变浅拷贝对象中的基本类型变量,原对象不改变,但是如果改变浅拷贝对象中的印用类型,原对象也改变。 浅拷贝代码:
var obj3 = shallowCopy(obj1);
function shallowCopy(src) {
var dst = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}
深拷贝代码:
function extend(target, source, deep) {
for (key in source)
if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
// source[key] 是对象,而 target[key] 不是对象, 则 target[key] = {} 初始化一下,否则递归会出错的
if (isPlainObject(source[key]) && !isPlainObject(target[key]))
target[key] = {}
// source[key] 是数组,而 target[key] 不是数组,则 target[key] = [] 初始化一下,否则递归会出错的
if (isArray(source[key]) && !isArray(target[key]))
target[key] = []
// 执行递归
extend(target[key], source[key], deep)
}
// 不满足以上条件,说明 source[key] 是一般的值类型,直接赋值给 target 就是了
else if (source[key] !== undefined) target[key] = source[key]
}
// Copy all but undefined properties from one or more
// objects to the `target` object.
$.extend = function(target){
var deep, args = slice.call(arguments, 1);
//第一个参数为boolean值时,表示是否深度合并
if (typeof target == 'boolean') {
deep = target;
//target取第二个参数
target = args.shift()
}
// 遍历后面的参数,都合并到target上
args.forEach(function(arg){ extend(target, arg, deep) })
return target
}
作者:sunshine小小倩
链接:https://juejin.im/post/59ac1c4ef265da248e75892b
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
。