gpt4 book ai didi

javascript - 使用 variable != null 而不是 variable !== undefined && variable !== null 是否可以接受?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:36:01 29 4
gpt4 key购买 nike

我有一些代码,其中变量可以是 undefinednull 或正常值。无论变量是 undefined 还是 null,代码都需要做同样的事情。说有没有危险

for (var cur = this.buckets[i]; cur != null; cur = cur.next) {

代替

for (var cur = this.buckets[i]; cur !== undefined && cur !== null; cur = cur.next) {

完整程序如下(有问题的行在 HashTable.prototype.walk 中)。

var hash_seed = Math.floor(Math.random() * 256);

function jenkins_hash(key, interval_size) {
var hash = hash_seed;
for (var i=0; i<key.length; ++i) {
hash += key.charCodeAt(i);
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
// make unsigned and modulo interval_size
return (hash >>> 0) % interval_size;
}

//constructor, takes the number of buckets to create
function HashTable(size) {
this.buckets = new Array(size);
}

//private method, ignore
HashTable.prototype._position = function(key) {
var index = jenkins_hash(key, this.buckets.length);
var cur = this.buckets[index];

if (cur === undefined) {
return { i: index, cur: null, prev: null };
}

var prev = cur;
for (; cur !== null; cur = cur.next) {
if (cur.key == key) {
return { i: index, cur: cur, prev: prev };
}
prev = cur;
}

return { i: index, cur: cur, prev: prev };
};

// associate a value with a key in the hash
HashTable.prototype.store = function(key, value) {
var r = this._position(key);
if (r.prev === null) {
this.buckets[r.i] = {
key: key, value: value, next: null
};
return;
}

if (r.cur !== null) {
r.cur.value = value;
return;
}

r.prev.next = {
key: key, value: value, next: null
};
return;
};

// fetches the value associated with the key
// returns undefined if the key is not in the hash
HashTable.prototype.fetch = function(key) {
var r = this._position(key);
if (r.cur === null) {
return undefined;
}

return r.cur.value;
};

// returns true if the key is in the hash
// returns false if the key isn't in the hash
HashTable.prototype.exists = function(key) {
var r = this._position(key);
return r.cur !== null;
};

// removes a key from the hash
HashTable.prototype.delete = function(key) {
var r = this._position(key);
if (r.cur === null) {
return;
}
if (r.cur === r.prev) {
this.buckets[r.i] = r.cur.next;
}
r.prev.next = r.cur.next;
};

// removes all keys from the hash
HashTable.prototype.clear = function() {
var length = this.buckets.length;
this.buckets = new Array(length);
};

// run a funciton for every key/value pair in the hash
// function signature should be function(k, v) {}
// WARNING: adding keys to the hash while this method is
// running may lead to unexpected results
HashTable.prototype.walk = function(func) {
for (var i = 0; i < this.buckets.length; i++) {
for (var cur = this.buckets[i]; cur != null; cur = cur.next) {
func(cur.key, cur.value);
}
}
};

// returns all of the keys in the hash
HashTable.prototype.keys = function() {
var keys = [];
this.walk(function(k,v) { keys.push(k) });
return keys;
};

// run a function for every key/value pair in the hash
// function signature should be function(k, v) {}
// WARNING: only keys in the hash when the method is called
// will be visited; however, changes to their values will be
// reflected
HashTable.prototype.safer_walk = function(func) {
var keys = this.keys();
for (var i = 0; i < keys.length; i++) {
func(keys[i], this.fetch(keys[i]));
}
}

var h = new HashTable(101);

h.store("abc", 5);
h.store("def", 6);
h.walk(function(k, v) { console.log(k + " => " + v) });

最佳答案

!= 的语义定义明确。如果与 null 比较,则:

  • 如果“cur”为undefinednull,则结果为false
  • 如果“cur”是其他值,则结果为true

“抽象”相等比较(类似于严格比较)首先检查每个操作数的类型(请注意,这与 typeof 返回的不同!)。 null的类型是Null类型,undefined的类型是Undefined类型。抽象比较算法明确地将 undefinednull 视为相等。

因此,您自己对 nullundefined 进行显式检查真的没有意义。 (当然,如果您需要与语言中内置的抽象比较不同的逻辑,您可能需要单独检查。)

关于javascript - 使用 variable != null 而不是 variable !== undefined && variable !== null 是否可以接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16400630/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com