- 1. 如何正确获取Javascript对象的类属性呢?---toString()
由于JS中很多对象继承toString()被重写了,为了能正确调用toString()版本,必须间接调用Function.call()方法
function classOf(o){
if(o === null) return 'Null';
if(o === undefined) return 'Undefined';
return Object.prototype.toString.call(o).slice(8,-1);
}
测试一下:
classOf({}); //==>"Object"
classOf(''); //==>"String"
classOf(2); //==>"Number"
classOf([]); //==>"Array"
classOf(null); //==>"Null"
classOf(/./); //==>"Regexp"
classOf(new Date()); //==>"Date"
classOf(false) //==>"Boolean"
- 2. JS中可被判定为false的6种情况
js必须牢记的6个蛋蛋: 请你一定要记住:在js逻辑运算中,0、""(空字符)、null、false、undefined、NaN都会判为false,其他都为true,这个一定要记住,不然应用 || 和 && 就会出现问题。
- 3. ' !! ' 作用与用法
var a;
var b=!!a;
a默认是undefined。!a是true,!!a则是false,所以b的值是false,而不再是undefined,也非其它值,主要是为后续判断提供便利。
!!的作用是把一个其他类型的变量转成的bool类型。
- 4. 变量提升-- 关键字var、let
var a = {b:a} //=>由于var变量提升,在对a进行打印的时候 {b:undefined}
let a = {b:a} //=>let关键字不会造成变量提升,在这样去定义a变量的时候会报错 a is not defined
- 5.在js中绑定onclick事件为什么不加括号,在html代码中必须要加?
加上括号是执行的意思,添加事件的回调函数应该就是给相应的事件属性赋值,而很明显需要把一个函数赋值给这个事件属性,而不是函数的调用结果。所以在js中的绑定是直接赋值。
而在标签内的事件属性的值是由引号包裹的,代表的是当点击该元素时,执行引号内的代码,直接把引号内的代码拿出来跑,如果你不加括号,那就不会调用那个函数。
<a herf="javascript:;" onclick="fn" /> //=> ƒ fn(){console.log('test')}
<a herf="javascript:;" onclick="fn()" /> //=> test
funciton fn(){
console.log('test')
}
这两个标签执行时相当于在相应的事件里执行eval("...")
,第一个标签点击时等价于eval("fn")
,输出函数fn
的函数体ƒ fn(){console.log('test')}
,也就是说用户点击时并没有得到想要的结果;第二个标签点击时等价于eval("fn()")
,输出test
,可以得到目的结果,所以在html标签上的事件属性的值如果是要调用function
就一定要加()
来保证点击后可以得到目的结果。
- 6.在js中
~
、~~
、!!
、|=
、|
、&
、<<
、>>
、>>>
的含义以及用法?
~
按位取反运算符
表达式 | 二进制值 | 结果 |
---|---|---|
5 | 0000 0101 | 5 |
~5 | 1111 1010 | -6 |
换算的过程如下:
步骤 | 数值 | 描述 |
---|---|---|
0000 0101 | ||
按位取反 | 1111 1010 | 发现最高位是1,代表符号-负数 |
除符号位外按位取反 | 1000 0101 | |
末位加1求其补码 | + 1 | |
结果 | 1000 0110 | 转换成十进制为-6 |
-
7.JSON.parse()与JSONstringfy()详细用法
JSON对象包含两个方法: 用于解析 JavaScript Object Notation (JSON) 的 parse() 方法,以及将对象/值转换为 JSON字符串的 stringify() 方法。除了这两个方法, JSON这个对象本身并没有其他作用,也不能被调用或者作为构造函数调用,具体参考JSON
。
JSON中严格是要使用双引号""
而不是单引号''
先看MDN上的
JSON.parse()
说明:
JSON.parse()
方法用来解析JSON字符串,构造由字符串描述的JavaScript 值或对象。提供可选的reviver函数用以在返回之前对所得到的对象执行变换。JSON.parse(text[, reviver])
参数
text
要被解析成JavaScript值的字符串。reviver
(可选)
转换器, 如果传入该参数(函数),可以用来修改解析生成的原始值,调用时机在 parse函数返回之前。返回值
Object
类型, 对应给定JSON文本的对象/值
使用示例:JSON.parse('{}'); // {} JSON.parse('true'); // true JSON.parse('"foo"'); // "foo" JSON.parse('[1, 5, "false"]'); // [1, 5, "false"] JSON.parse('null'); // null JSON.parse('1'); // 1
以上的示例都是
JSON.parse()
适用的类型。下面再看一下
JSON.stringfy()
方法:
JSON.stringify()
方法是将一个JavaScript值(对象或者数组)转换为一个 JSON 字符串,如果指定了replacer是一个函数,则可以替换值,或者如果指定了replacer是一个数组,可选的仅包括指定的属性。JSON.stringify(value[, replacer [, space]])
参数
value
将要序列化成 一个JSON 字符串的值。replacer
(可选)
如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化;关于该参数更详细的解释和示例,请参考使用原生的 JSON 对象一文。space
(可选)
指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;如果该参数没有提供(或者为null)将没有空格。返回值
一个表示给定值的JSON字符串。
JSON.stringify({}); // '{}' JSON.stringify(true); // 'true' JSON.stringify("foo"); // '"foo"' JSON.stringify([1, "false", false]); // '[1,"false",false]' JSON.stringify({ x: 5 }); // '{"x":5}'
chrome开发者模式执行结果如下:
可以看到黑色双引号内的内容与我们转进行stringfy之前的是一样的。
我们从这两个方法看出来parse
方法需要的是单引号,stringfy
执行后是双引号,如果将执行结果复制再用parse
方法执行就会报错,如果用stringfy
执行后结果赋值给变量,再将这个变量用parse
方法转换就会得到预期结果。
网友评论