一些前端的心得体会,笔记

Js

1. js的5种原始类型

  • Null,Undefined,String,Number,Boolean

  • Number:数字,值为任何整型会浮点数值

  • String:字符串,值为由单引号或双引号括出的单个字符或连续字符(JavaScript不区分字符类型)

  • Null:空类型,其仅有一个值:null

  • Undefined:未定义,其仅有一个值:undefined

  • Boolean:一般我们判断属性或对象是否存在,都用if(xxx){…},但这样有个问题就是当值是一个null、undefined、0、false、NaN或空字符串时评估为假,比如
    var a = 0时,会被判断为false因而检测属性是否存在最好用in和hasOwnProperty(),前者会检查原型成员和实例成员,而后者只检查实例成员

  • 对于字符串、数字或者布尔值,其都有对应的方法,这些方法来自于对应的原始封装类型:String、Number和Boolean。原始封装类型将被自动创建。(也就是说当我们用一些原始类型的方法的时候,会创建一个原始类型来掉用这些方法,调用完后销毁)

    var name = "Pomy";
    var char = name.charAt(0);
    console.log(char);  //"P"

    在JavaScript引擎中发生的事情:

    var name = "Pomy";
    var temp = new String(name);
    var char = temp.charAt(0);
    temp = null;
    console.log(char);  //"P"

2. function中的arguments

  • Arguments是Function.prototype上的一个属性

  • Arguments属于function的实参,而function的形参则是其写在参数括号里面的参数:function(xxx,xxx){…}

  • Arguments与形参不指向同一个内存空间,arguments可以追踪参数的变化,当更改arguments的值时,形参也会发生变化:
    这里写图片描述反之,修改形参的值,arguments也会改变:
    这里写图片描述

  • 可以通过arguments.length查看实参列表的长度,通过arguments.callee.length查看形参列表的长度

3. 属性

  • Object
    对象有2类属性,一种叫做原型成员,一种叫做实例成员,原型成员是从prototype面继承过来的,大部分原型成员的上.Enumerable的值均为false,这个属性指明了该属性能否被枚举,因此实例成员的Enumerable为true

  • 属性有两种类型:数据属性和访问器属性

  • 属性的属性特性 (特征:指导其行为)
    数据属性:[[Enumerable]]、[[Configurable]]、[[Value]]和[[Writable]]
    访问器属性:[[Enumerable]]、[[Configurable]]、[[Get]]和[[Set]]

  • [[Enumerable]] :布尔值,属性是否可枚举,自定义属性默认是true。 [[Configurable]]:布尔值,属性是否可配置(可修改或可删除),自定义属性默认是true。它是不可逆的,即设置成false后,再设置成true会报错。
    [[Value]]:保存属性的值。 [[Writable]]:布尔值,属性是否可写,所有属性默认可写。 [[Get]]:获取属性值。
    [[Set]]:设置属性值。

  • ES 5 提供了两个方法来设置内部属性:
    单个属性:Object.defineProperty(obj,pro,desc_map)
    这里写图片描述
    多个属性Object.defineProperties(obj,pro_map)
    这里写图片描述
    通过这两个方法创建的属性,如果没指定特征值,则默认是false,可以通过 Object.getOwnPropertyDescriptor(obj,pro)查看属性特征描述
    这里写图片描述
    通过赋值方式构建的属性
    这里写图片描述

4. 对象

  • 对象与属性一样,也有指导其行为的内部特征,其中[[Extensible]]指明该对象本身是否可以被修改,当创建对象时,该值默认为true,可以扩展,添加新的属性

  • 与属性的Object.defineProperty(obj,pro,desc_map)和Object.defineProperties(obj,pro_map)一样,ES
    5同样也针对‘对象扩展’提供了三个方法

  • Object.preventExtensions(obj):创建不可扩展的obj对象,可以利用Object.isExtensible(obj)来检测obj是否可以扩展。严格模式下给不扩展对象添加属性会报错,非严格模式下则添加失败。
    这里写图片描述
    事实证明Object.preventExtensions(obj)并未改变对象内的属性的特 征,只改变了该对象本身的内部特征,个人猜测应该是将[[Extensible]] 改为了false
    这里写图片描述

  • Object.seal(obj):封印对象,此时obj的属性变成只读,不能添加、改变或删除属性(所有属性都不可配置),其[[Extensible]]值为false,[[Configurable]]值为false。可以利用Object.isSealed(obj)来检测obj是否被封印。
    这里写图片描述
    可以看到,封印对象后,单单改[[Extensible]]已经无法满足‘不能在 冻结对象上删,改属性’这个要求,因此它将已有的属性的属性特征设置 为不可配置(删),但在这里我就想问了为什么没有把writable设为false, 表示俺封印了此子,但这厮竟然还能修改属性值
    这里写图片描述
    &
    这里写图片描述
    注意,禁止修改对象的三个方法只对对象的自有属性有效,对原型对象的 属性无效,仍然可以在原型上添加或修改属性。

  • Object.freeze(obj):冻结对象,不能在冻结对象上添加或删除属性,不能改变属性类型,也不能写入任何数据类型。可以利用Object.isFrozen(obj)来检测obj是否被冻结。
    这里写图片描述
    还好,冻结对象后,它将已有的属性的属性特征设置为不可写(改),不可 配置(删)
    这里写图片描述
    注意:冻结对象和封印对象均要在严格模式下使用

4. Function

Function有两种定义方式:函数表达式,函数声明:

  • 函数声明:解析器在解析全局的function或function内的function关键字时,默认认为是函数声明。(在解析器中存在一种变量声明被提升(hoisting)的机制,说形象点就是变量的声明会被提升到作用域前面,其具体实现是在创建活动对象的时候创建的同名属性,其值为undefined)。
  • 函数声明必须要指定函数名,否则会报”SyntaxError: Unexpected token (”
    这里写图片描述

  • 函数表达式:其写法如var xxx = function [ name ](){…},函数表达式可以直接被执行
    这里写图片描述
    而函数声明想要被直接调用,则需要通过()”分组操作符“来进行转化,分组操作符有三个作用:

    • 赋值:var a = (1,2) //2
    • 转化为表达式:(function (){console.log(1)})() //1
    • 调用函数:

      function a(){console.log(1)}; 
      a() //1

其他

前端的知识太多,感觉如果不记录下自己每天所看所学的话,很容易就忘记了,因此这篇博客将会持续更新,保留我看的东西以及一些看法,留待以后方便查阅回忆。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值