js知识总结(eval函数、伪数组和instanceof关键字的使用)
一:Object.protoType成员介绍:
var obj={
name:'jack',
age:20
}
1.constructor属性:指向和该原型相关的构造函数
2.hasOwnProperty方法:判断该对象自身是否拥有指定名称的属性
console.log(obj.hasOwnProperty('name'));true
console.log(obj.hasOwnProperty('age'));false
3.isPrototypeOf:判断一个对象是否是另外一个对象的原型,如下面的代码是判断obj是否是obj1的原型
var obj1={};
obj1.__proto__=obj;
console.log(obj.isPrototypeOf(obj1));
4.propertyIsEnumerable: 判断属性是否属于自身 同时判断属性是否可以遍历
注意:使用defineProperty添加的属性不能被遍历到
console.log(obj.propertyIsEnumerable('gender'));
5.toLocalString/toString,如日期格式不一样
toLocalString:将对象转换为本地格式的字符串
toString:将对象转换为国际通过的字符串
var d=new Date();
console.log(d.toString());
console.log(d.toLocaleString());
valueOf():用来获取对象的值。一般是使用在引用类型和值类型进行相互运算的时候。系统会首先调用valueOf方法来获取引用类型数据的值,如果这个值可以参与运算则使用其进行运算,如果不可以,还会调用toString方法获取对象的值参与运算
二:Function
- 函数也是一个对象,对象都是通过构造函数创建的,函数的构造函数就是Function,,JS中所有的函数的构造函数都是Function,可以通过new Function()来创建
Function初步使用:
1.如果直接使用new Function()而不传入任何的参数,那么就会创建出一个匿名函数
2.可以给函数传递一个参数,这个参数后期就会成为函数的函数体/
var fun=new Function();
console.log(typeof fun);
console.log(fun);/
var fun=new Function(‘console.log(“能不能输出”)’);
fun();
3.也可以给函数传入多个参数,前面的参数都是函数的参数,最后一个是函数体
var calculate=new Function(“a”,”b”,”return a+b;”);
var result=calculate(4,5);
console.log(result);
Function代码过长的问题的解决:
a) 拼接字符串
b) 使用反引号``
c) 使用\
d) 使用模板
e) 示例:计算数组中所有元素的和
var calcu=new Function(“arr”,"var sum=0;"+ "for (var i = 0; i < arr.length; i++) {"+ " sum+=arr[i];"+ "}"+ "return sum;");
var calcu=new Function(“arr”,
`var sum=0; for (var i = 0; i < arr.length; i++) { sum+=arr[i]; } return sum;`);
var calcu=new Function(“arr”,
"var sum=0;\ for (var i = 0; i < arr.length; i++) {\ sum+=arr[i];\ }\ return sum;");
var calcu=new Function(“arr”,document.getElementById(“fun”).innerHTML);
console.log(calcu([1,2,3,4]));
三:eval函数的使用:可以将字符串的内容当成js代码来执行
可以将eval中的字符串当成代码来解析
eval("var num=100;");
console.log(num);
可以将json格式字符串转换为json对象
注意:
1.eval函数会将json格式的字符串的{}当成代码块处理,造成报错
2.所以。可以给这个json字符串前后拼接一个()
3.这样,加了()后的字符串就会被认为是一个字面量来处理了
var jsonStr='{"name":"jack","age":20}';
var obj=eval("("+jsonStr+")");
eval("var obj="+jsonStr);
console.log(obj);
四:使用eval实现简易计算器:
document.querySelector("[type=button]").onclick=function(){
var num1=document.getElementById("num1").value;
var num2=document.getElementById("num2").value;
var opt=document.getElementById("opt").value;
var result=eval(num1+opt+num2);
document.getElementById("result").value=result;
}
五:函数对象的属性
- arguments:函数内部的一个变量,它是一个伪数组。当函数被调用的时候,会将所有的实参依次存入这个伪数组中,它只有在函数被调用的时候才会有值,它与函数.arguments的功能一样,存储的内容也一样,但并非同一个对象
- caller:获取当前函数是在哪个函数中被调用,注意,这个属性值必须在函数被调用的才能取到值,所以需要将 函数.caller 代码写在函数体内,当这段代码被执行的时候,就是这个函数被调用的时候。同时需要注意的时候,如果是全局调用,那么caller只能返回null
- length:形参的数量
- name:函数名称.通过函数表达式声明的函数,函数的name就是变量名称
- protoType:函数的原型
六:伪数组
- 概念:伪数组拥有与数组一样的下标,可以通过下标来访问各种元素,拥有长度属性,可以表示其中存储的元素的数量。但是没有数组类似的方法
七:instanceof关键字的使用:
- 作用:判断构造函数的protoType属性是否在对象的原型链上
- 示例:
instanceof:判断构造函数的protoType属性是否在对象的原型链上
function Person(){}
var p =new Person();
p—>Person.protoType–>Object.protoType—>null
console.log(p instanceof Person);
console.log(p instanceof Object);
console.log(‘—————–’);
Person–>Function.protoType—>Object.protoType—>null
console.log(Person instanceof Function);