![](/img/trans.png)
[英]Using typeof in JavaScript still causes error for undefined object
[英]why checking for undefined from a function call causes SSR error, but not directly using `typeof` in react?
任何人都可以帮助解释这种意外行为吗?
我有一个来自https://typeofnan.dev/using-session-storage-in-react-with-hooks/ 的可用useSessionStorage
钩子,如下所示:
import { useState, useEffect } from 'react';
function getSessionStorageOrDefault(key, defaultValue) {
if (typeof sessionStorage === 'undefined') {
return defaultValue;
}
const stored = sessionStorage.getItem(key);
if (!stored) {
return defaultValue;
}
return JSON.parse(stored);
}
function useSessionStorage(key, defaultValue) {
const [value, setValue] = useState(
getSessionStorageOrDefault(key, defaultValue)
);
useEffect(() => {
sessionStorage.setItem(key, JSON.stringify(value));
}, [key, value]);
return [value, setValue];
}
export default useSessionStorage;
请注意我如何检查以确保sessionStorage
已定义以确保它在 SSR 中工作:
if (typeof sessionStorage === 'undefined') {
return defaultValue;
}
现在,当我尝试将typeof sessionStorage === 'undefined'
替换为对名为isUndefined
的实用程序方法的调用isUndefined
,我收到 SSR 错误,即sessionStorage is not defined
。
这是isUndefined
实用程序方法
export function isUndefined(value) {
return typeof value === 'undefined';
}
这是调用isUndefined
并且 SSR 不再起作用的修改后的useSessionStorage
钩子:
import { useState, useEffect } from 'react';
import { isUndefined } from 'utils/lang';
function getSessionStorageOrDefault(key, defaultValue) {
if (isUndefined(sessionStorage)) {
return defaultValue;
}
const stored = sessionStorage.getItem(key);
if (!stored) {
return defaultValue;
}
return JSON.parse(stored);
}
function useSessionStorage(key, defaultValue) {
const [value, setValue] = useState(
getSessionStorageOrDefault(key, defaultValue)
);
useEffect(() => {
sessionStorage.setItem(key, JSON.stringify(value));
}, [key, value]);
return [value, setValue];
}
export default useSessionStorage;
为什么typeof sessionStorage === 'undefined'
工作,但用isUndefined(sessionStorage)
替换它会导致它不再工作?
这只是因为 JavaScript 和所有我能想到的所有编程语言的基本事实。 当您调用isUndefined(sessionStorage)
,您正在尝试将名为sessionStorage
的标识符标识的内存位置按值传递给函数isUndefined
。 为此,需要查找sessionStorage
标识符并读取其值,这当然是不可能的,因为它尚未声明,因此会出现错误。
另一方面, typeof
是一个operator 。 您没有将sessionStorage
的值传递给它,而是要求它查找该标识符的类型。 碰巧typeof
在传递未声明的标识符时的行为是返回'undefined'
而不是抛出错误。
最后,值得注意的是,javascript 中已声明但尚未定义的变量的默认值为undefined
,因此您可以将其传递给函数。
希望以下内容很清楚:
function isUndefined(identifier) {
return typeof identifier === "undefined"
}
let x = true
let y
isUndefined(x) // false
isUndefined(y) // true
isUndefined(z) // Uncaught ReferenceError: z is not defined
如果消息是“z 尚未声明”可能会更清楚,但希望您现在明白它真正告诉您的是什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.