基本包装类型
类型: String字符串对象 | Number数值对象 | Boolean布尔类型对象(区别于简单数据类型的字符串 / 数值 / 布尔值)
-
创建对象的方式
//一般创建方式-object var str = new String('demo'); //特殊创建方式-object var str = new Object('demo');
-
注意点
比较对象与对象-考虑引用类型数据的存储的值是地址(指向具体数据的地址)
-
对象和基本数据类型- 对象会转换成基本类型的值
new String('123') == new String('123'); //false new String('123') == '123'; //true
-
基本数据类型有属性?
- 字符串 / 数值 / 布尔基本数据类型在使用属性时
- 内部默认创建一个与之对应的对象
- 利用该对象使用属性和方法, 得到结果后返回
- 再销毁该对象
-
Number对象注意点
- 变量 / 表达式方式可以直接调用, 数值(可以加个括号封装成表达式的形式)不可以直接调用
Object.ptototype的属性详解
-
constructor
: 指向对象的构造函数 -
hasOwnProperty
: 判断对象是否有指定的实例属性 -
isPrototypeOf
: 判断一个对象是否是指定对象的原型对象(判断的是整一条原型链) -
propertyIsEnumerable
: 判断一个属性是否是可以枚举的 (可枚举表示可以通过for..in遍历出来) -
toString
: 返回对应的字符串描述信息, 返回值是string
- object对象-->
[object Obejct]
- 数组 | 函数-->对应的字符串形式
[1,2,3]-->1,2,3
- Number对象使用的时候可以传递参数表示进制转化
- object对象-->
-
toLocaleString
: 一般情况下和toString
, 在特殊情况下做本地化的处理 -
valueOf
: 返回对应的值- 对象返回对象本身
- 基本包装类型返回对应的基本数据类型的值
静态成员
- 定义: 构造函数也是一个对象, 因此它也有自己的属性和方法, 因此它的属性和方法称为静态成员
- 作用: 添加到构造函数上的属性和方法
Object静态成员
Object.constructor
: 指向对应的构造函数Object.assign
: 拷贝属性Object.arguments
: 函数内部的隐藏参数,用来接收实参Object.call
: 借用其他对象的方法Object.apply
: 借用其他对象的方法-
Object.caller
: 返回调用函数的函数, 如果在全局作用域中调用函数返回nullfunction f1() { console.log(f1.caller); } function f2() { f1(); } f2(); //返回f2() {f1(); } //f1(); //返回null
Object.create
: 创建对象并设置原型对象-
Object.getOwnPropertyDescriptor
获取一个对象某个属性的描述信息
-
Object.defineProperty
: 定义一个属性并设置描述对象- 注意点
- 修改已经存在的属性, 默认都是true
- 添加新的属性. 默认是false
- 属性
-
configurable: true
是否可以配置(1.是否可以删除 2.是否可以改变该配置) -
enumerable : true
是否可以枚举(是否可以通过for..in遍历) value : 'zs'
-
writable : true
是否可重写(是否可以修改这个属性值)
-
- 注意点
Object.getOwnPropertyNames
: 获取实例属性的属性名,返回数组,数组中存储是所有实例属性的属性名Object.keys
: 获取对象的所有属性名, 不包括原型属性和不可以枚举的实例属性Object.getPrototypeOf
: 获取对象的原型对象-
Object.preventExtensions | Object.isExtensible(object) 返回一个值,该值指示是否可向对象添加新属性
- 禁止扩展,不能添加属性
-
Object.seal | Object.isSealed
- 密封对象 :禁止扩展,不能添加属性,不能删除,可以修改
-
Object.freeze | Object.isFrozen
- 冻结对象:不能添加属性,不能删除,不能修改
Function构造函数的使用
-
Function构造函数创建方式
- 声明函数
- 函数表达式
//命名函数表达式 var fun1 = function demo() { } //匿名函数表达式 var fun1 = function () { }
- new构造函数
-
注意点
没有参数-->表示函数体没有内容
1个参数-->这个参数作为函数体
-
多个参数-->最后一个参数作为函数体, 其他是形参
var fun = new Function('a','b',"console.log(a + b);"); fun(1,2);
-
参数过长问题
使用+ 拼接
使用反括号(``)替换字符串的引号
-
使用JS模板
<script type = "text/template" id = "demo"> console.log("来不及祈祷就开始奔跑"); console.log("总觉得外面世界有多美好"); console.log("用几滴眼泪才换来骄傲"); console.log("我要的光荣哪怕只有一秒"); </script>
函数隐藏参数(arguments, this)
-
arguments
: 函数内部的隐藏参数, 接收实参, 保存实参- 定义: 是一个对象, 类似于数组
- 判断是不是数组
Array.isArray
|Object.prototype.toString.call()
的结构
- 判断是不是数组
- 定义: 是一个对象, 类似于数组
- 实参和形参
- 函数调用时, 默认会把实参赋值给形参, 并把实参保存在arguments中
- 实参 < 形参, 依次赋值, 没有赋值的形参是undefined
- 实参 > 形参, 超出的实参可以通过arguments[i]获取到
-
函数名.length
: 形参的长度 -
arguments.length
:实参的长度
caller | callee
-
caller
: 返回调用函数的函数, 在全局作用中调用返回null -
arguments.callee
:arguments
对象有个属性callee
返回函数自身, 常用于递归调用中(自己调用自己, 有退出条件, 否则死循环)- 一般用在闭包匿名函数中, 递归调用获取自己
arguments.callee
(不常用, 一般arguments[i]用以获取参数, 一般使用命名递归函数自调)
- 一般用在闭包匿名函数中, 递归调用获取自己
Function小应用(数组去重/求最大值)
- 去重: 返回一个数组, 数组中存储所有实参, 并且不重复
- 遍历所有实参-判断数组中是否添加过实参(
arr.indexOf(arguments[i])
, 若没添加就返回-1)
- 遍历所有实参-判断数组中是否添加过实参(
- 求最大值思想
- 假设实参第一个值为最大值
- 遍历所有实参与第一个实参进行对比
- 判断实参, 如果比定义的第一个实参值大, 就赋值给第一个参数
- 返回最大值
Function.prototype原型链-绘图
- 思考
- Object.prototype的构造函数是谁
-
Object由哪个构造函数创建出来
Object和Function的关系
- Object和Function互为对方的实例
- JS中, 所有对象都是继承Object
私有变量/函数-特权方法
- 定义: 定义在构造函数内部的变量和函数, 在外界(函数外)访问不到
- 特权方法: 可以访问私有变量和私有函数的实例方法
eval
- 定义: 可以把字符串转换对应的JS代码(和ES5支持的
JSON.parse()
一样处理JSON数据), 并且会立刻执行 - 区别Function
- Function把字符串转为代码, 需要调用函数才会执行
- 不建议使用: JS是词法作用域, eval函数可以动态调整(破坏)其作用域, 性能不好
with
定义: 可以把对象的作用域引申到{}中, 减少代码量-作用跟动态添加属性方法一样
-
作用: 通过深层次引用属性(
对象.属性.属性...
)的时候with(div.style){ width = '10px'; height = '10px'; } //优化-及时函数替代with (function(t){ t.width = '10px'; t.height = '10px'; })(div.style)
-
注意
- 可以通过无前缀的方式修改属性
- 不能通过无前缀的方式添加属性
- 在严格模式下禁止使用, this在其作用域指向的是window