JS Python真假判断

问题

在看算法时,出现这样的问题(真假值判断问题)

  • 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中变量真假值判断

类型FalseTrue
布尔False(与0等价)True(与1等价)
数值0, 0.0非零的值
字符串‘’, “”(空字符串)非空字符串
对象传入一个对象,即使为内容为空
[], {},function(){}
Nonenull
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中变量真假值判断

类型FalseTrue
布尔False(与0等价)True(与1等价)
数值0, 0.0非零的值
字符串‘’, “”(空字符串)非空字符串
容器[], (), {}, set()至少有一个元素的容器对象
NoneNone非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'
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值