w3ctech

我的360面试

我的360面试

其实这次面试机会是unescape("%u88D5%u6CE2");老师帮忙争取过来的,我非常感谢unescape("%u88D5%u6CE2");老师,但是学生的表现让老师失望啦,老师帮助学生太多啦,学生只能好好学习,天天向上,希望终有一天能够和老师成为同事,废话不多说啦,开始进入正题:
1.文博老师问我,js中的数据类型有哪些?(这个比较简单)
Null,Undefined,String,Boolean,Number,Object
2.然后如何检测一个数据的数据类型?(这个比较简单)
我开始说可以用typeof这个操作符可以检测简单的数据类型,但是遇到比较复杂的,例如var date = new Date();返回的是object,然后我提出Object.prototype.toString.apply(date);可以检测出,但是我忘记说比较简单的方法date.constructor,但是这个方法有局限性,就是当date值为null,undefined,数字0等就会报错,按照我的理解,null和undefined就像从空指针中读取属性一样,在java和c语言中会报空指针异常,然而数字0是数字常量,没有内存地址,简而言之不是个对象,解决方案var num = 0;然后调用num.constructor或者(0).constructor(ps:对于加括号,我的理解是将数字0隐性变成一个对象,但是单独来看0和(0),同时使用typeof操作符返回的结果是一样的),针对null和undefined情况,解决方案是例如var data = null;或者var data = void 1;可以使用data&&data.constructor
3.Object.prototype.toString.apply(date);最后返回的结果是什么?
其实一个字符串"[object Date]"
未完待续

w3ctech微信

扫码关注w3ctech微信公众号

共收到10条回复

  • 你能好好编辑一下格式吗?

    回复此楼
  • @裕波 好的,还没写完呀

    回复此楼
  • 先顶再看

    回复此楼
  • > 然后如何检测一个数据的数据类型?

    1 这个问题里的数据类型不是应该是第一个问题里的数据类型吗, 用 typeof operator 就可以, 如果得出是的 object 再看看是不是null.

    2 Object.prototype.toString 应该主要用于对象内型的检测
    3 constructor 属性不可靠, 可能会被override

    回复此楼
  • mark

    回复此楼
  • @William17 constructor覆盖可以避免,也可以用安全模式写,非安全是来自别人的代码,我们只需要保证内部代码的安全。

    回复此楼
  • 其实不用想那么多,特殊值在判断前可以用其他方式判断排除,然后对正常的进行检测,最后date之类特殊值可以单独来就行了。如果外部输入环境确定的情况下,选择更合适的方式会更节约性能。

    回复此楼
  • mark

    回复此楼
  • @卢林 自己的代码当然可以控制.我的意思是constructor不能作为一个通用的解决方案,就是因为它不可靠

    回复此楼
  • @William17 嗯嗯~^0^

    回复此楼