问题
在看算法时,出现这样的问题(真假值判断问题)
-
JS 需要求数组的长度 才能判断为 空数组(返回false)
-
Python 不需要求数组的长度 就可以判断为 空数组(返回false)
JS代码
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
Python代码
while left and right:
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
JS中变量真假值判断
类型 | False | True |
---|---|---|
布尔 | False(与0等价) | True(与1等价) |
数值 | 0, 0.0 | 非零的值 |
字符串 | ‘’, “”(空字符串) | 非空字符串 |
对象 | 传入一个对象,即使为内容为空 [], {},function(){} | |
None | null undefined NaN | 非None对象 |
>>> 0 ? 'true' : 'false'
"false"
// 字符型的0,判定为真
>>> '0' ? 'true' : 'false'
"true"
>>> '' ? 'true' : 'false'
"false"
// 字符串如果只含有空格,判定为真
>>> ' ' ? 'true' : 'false'
"true"
// [] 类同于new Array()
>>> [] ? 'true' : 'false'
"true"
// {} 类同于new Object()
>>> {} ? 'true' : 'false'
"true"
// function(){} 类同于new Function()
>>> function(){} ? 'true' : 'false'
"true"
>>> new Date() ? 'true' : 'false'
"true"
>>> new RegExp() ? 'true' : 'false'
"true"
// 空字符串对象,判断为真(对象是存在的)
>>> new String("") ? 'true' : 'false'
"true"
>>> null ? 'true' : 'false'
"false"
>>> undefined ? 'true' : 'false'
"false"
>>> NaN ? 'true' : 'false'
"false"
JS判断相等的问题
基本数据类型的值直接存储在栈内存中
引用数据类型保存到堆内存中,变量保存的是对象的内存地址
两者的区别:传值和传址
{} == {} // false
[] == [] // false
浅拷贝
当我们使用对象拷贝,如果属性是对象或数组时,这时我们传递的只是一个地址。因此对象在访问属性时,会根据地址回溯到父对象的堆内存中,即父子对象发生了关联,两者的属性会指向同一内存空间
有如下方法可以实现浅拷贝:
- 如下代码中的 Copy 函数
- 使用 Loadsh 里的 clone
- 使用
Object.assign()
var a = {
name: 'abc'
};
function Copy(obj) {
var new_obj = {};
for (var i in obj) {
new_obj[i] = obj[i];
}
return new_obj;
}
a.hobby = ['reading', 'coffee'];
var b = Copy(a);
// 使用Object.assign也可以进行浅拷贝
// var b = Object.assign({}, a)
b.age = 18;
print(b.age); // 18
print(a.age); // undefined
// a对象中的hobby为数组,父子对象之间就会发生关联
b.hobby.push('running');
print(b.hobby); // [ 'reading', 'coffee', 'running' ]
print(a.hobby); // [ 'reading', 'coffee', 'running' ]
深拷贝
在实际编码中,我们不希望父子对象之间产生关联,这是就要用到深拷贝,既然属性值类型是数组或对象时只传地址,那么就可以用递归来解决这个问题,把父对象中所有属于对象的类型遍历赋给子对象即可
有如下方法可以实现深拷贝:
-
如下代码中的 DeepCopy 函数
-
使用 Loadsh 里的 cloneDeep
-
使用
JSON.parse(JSON.stringify())
如果里面有一个方法,比如 say(){},方法不能被序列化,则不能进行拷贝
var a = {
name: 'abc',
hobby: ['reading', 'coffee']
};
function DeepCopy(f_obj, s_obj) {
var s_obj = s_obj || {};
for (var i in f_obj) {
if (typeof f_obj[i] == 'object') {
s_obj[i] = Array.isArray(f_obj[i]) ? [] : {};
DeepCopy(f_obj[i], s_obj[i])
} else {
s_obj[i] = f_obj[i];
}
}
return s_obj
}
var b = DeepCopy(a, {});
// var b = JSON.parse(JSON.stringify(a));
b.hobby.push('running');
print(b.hobby); // [ 'reading', 'coffee', 'running' ]
print(a.hobby); // [ 'reading', 'coffee' ]
Python中变量真假值判断
类型 | False | True |
---|---|---|
布尔 | False(与0等价) | True(与1等价) |
数值 | 0, 0.0 | 非零的值 |
字符串 | ‘’, “”(空字符串) | 非空字符串 |
容器 | [], (), {}, set() | 至少有一个元素的容器对象 |
None | None | 非None对象 |
>>> 'true' if 0 else 'false'
'false'
# 字符型的0,判定为真
>>> 'true' if '0' else 'false'
'true'
>>> 'true' if '' else 'false'
'false'
# 字符串如果只含有空格,判定为真
>>> 'true' if ' ' else 'false'
'true'
>>> 'true' if () else 'false'
'false'
>>> 'true' if [] else 'false'
'false'
>>> 'true' if {} else 'false'
'false'
>>> 'true' if None else 'false'
'false'