JavaScript是弱类型的语言,所以对变量的类型并没有强制控制类型。所以声明的变量可能会成为其他类型的变量, 所以在使用中经常会去判断变量的实际类型。 对于一般的变量我们会使用typeof来判断变量类型。
例如:在下面codesandbox中声明一个变量a,并赋值一个字符串'love you forever',然后使用typeof可以获得指定变量的类型,可以在web-preview看到结果是String类型,再次向变量a赋值数字123,则判断的类型为number,我再次向变量a赋值一个对象和一个数组,下面的web-preview结果显示却都是object,what。这是为什么?
所以去MDN查阅相关资料,MDN对于typeof的参数描述内容为"一个表示对象或原始值的表达式"以及对typeof可能返回值如下表:
类型 | 结果 |
---|---|
Undefined | "undefined" |
Null | "object" |
Boolean | "boolean" |
Number | "number" |
String | "string" |
Symbol(es6) | "symbol" |
宿主对象(BOM和DOM) | 取决于具体实现 |
Function | "function" |
其他对象 | "object" |
从表中似乎没有看到Array的字样,说明可能包含在其他对象,所以typeof不适合做array的判断。有没有其他的方式呢?查阅资料发现四种方法.
let numbers = [1, 2, 3, 4, 5] let isArray = numbers.construstor === Array ? 'yes' : 'no' console.log(isArray)
let numbers = [1, 2, 3, 4, 5] let isArray = Object.prototype.toString.call(numbers) === '[object Array]' ? 'yes' : 'no' console.log(isArray)
let numbers = [1, 2, 3, 4, 5] let isArray = numbers instanceof Array ? 'yes' : 'no' c
let numbers = [1, 2, 3, 4, 5] let isArray = Array.isArray(numbers) ? 'yes' : 'no' console.log(isArray)
下面是用codesandbox执行的结果
<iframe allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts" src="https://codesandbox.io/embed/gracious-ritchie-rrr14?fontsize=14&hidenavigation=1&theme=light&view=preview" style="width: 100%; height: 500px; border: 0; border-radius: 4px; overflow: hidden" title="gracious-ritchie-rrr14"></iframe>不知不觉又爬过了一个坑。编码路上没有捷径,没有代码量的积累,就没有值得飞跃。感谢各位看到这里,希望大家在不断地努力下能早日实现自己的前端梦。