昨天泡了大半天的读书馆,一口气看完了《javascript语法精粹》这本书,总体来说这本书还是写的不错,难怪那么多的推荐。《javascript语法精粹》主要是归纳与总结了javascript中的重点知识,下面我把我看玩后觉得比较重要的知识点分享出来。

  《javascript语言精粹》重要知识点

一、比较有意思的递归函数

  1.一个有意思的递归,形成数据结构,0,1,1,2,3,5,8,13……(其实在我的《javascript常用知识点集》中也写过这个递归,在不厌其烦的提一下)

  ①方法一:

var fibonacci = function (n){
//return n<2 ? n : arguments.callee(n-1) + arguments.callee(n-2);
return n< ? n :fibonacci(n-)+fibonacci(n-);
}

  ②闭包方法实现:

var fibonacci = function(){
var memo = [,];
var fib = function(){
var result = memo[n];
if(typeof result !== 'number' ){
result = fib(n-) + fib(n-);
memo[n] = result;
}
return result;
}
return fib;
}()

二、正则部分RegExp

  (...)捕获型分组,又可以叫字表达式,捕获型分组会复制它所匹配的文本,并将其放到result数组里,每个捕获分组都会被指定一个编号。
  (?:)非捕获性分组,仅做简单的匹配,并不会捕获所匹配的文本,性能比捕获性分组效率高,非捕获性分组不会干扰捕获型分组的编号。
  正则转义,如果对特殊字符转义拿捏不准时,可以给任何特殊字符都添加一个\前缀来使其字面化,注意\前缀不能使字母或数字字面化。常见的需要转义的字符 - / [ \ ] ^ {}等

三、javascript中的标准方法集

  ①Array

  array.concat(item...)
  contcat方法产生一个数组,它包含一份array的浅复制并把一个或多个参数item附加在其后。

  array.join(separator)
  join方法把一个array构造成一个字符串。它先把array中的每个元素构造成一个字符串,接着用一个separator分隔符串把他们连接在一起。

  array.pop()
  pop和push方法使得数组array可以像堆栈(stack)一样工作。pop方法移除array中的最后一个元素并返回该元素。

  array.push(item...)
  push方法把一个或多个参数item附加到一个数组的尾部,返回这个array的新长度值。

  array.reverse()
  reseverse方法反转array里的元素的顺序,并返回array本身。

  array.shift()
  shift方法移除数组array中的第一个元素并返回该元素。如果这个数组array为空的,它就会返回undefined。通常shift比pop慢。

  array.slice(start,end)
  slice方法对array中的一段做浅复制。首先复制array[start],一直复制到array[end]为止。

  array.sort(comparefn)
  sort方法对array中的内容进行排序。排序原理为哈希表,sort方法排序不稳定,排序的稳定性是指排序后数组中的相等值得相对位置没有发生改变,而不稳定性排序则会改变相等值得相对位置。

  array.splice(start,deleteCount,item,……)
  splice方法从array中移除一个或多个元素,并用新的item替换它们。

  array.unshift(item...)
  unshift方法像push方法一样,用于把元素添加到数组中,但它是把item插入到array的开始部分而不是层部。

  

  ②Function

  function.apply(thisArg , argArray)
  apply方法调用function,传递一个会绑定到this上的对象和一个可选的数组作为参数。apply方法被用在apply调用模式中。

  例arg.concat(slice.apply(arguments,[]));
  function.call(this)

  ③Number

  number.toExponential(fractionDigits)
  toExponential方法把这个number转换成一个指数形式的字符串。可选参数fractionDigits控制其小数点后的数字位数。它的值必须在0~20:

document.writeln(Math.PI.toExponential()); //3e+0
document.writeln(Math.PI.toExponential()); //3.14e+0
document.writeln(Math.PI.toExponential()); //3.1415927e+0

  number.toFixed(fractionDigits)
  toFixed方法把这个number转换成为一个十进制数形式的字符串。可选参数fractionDigits控制其小数点后的数字位数

Math.PI.toFixed() //3.1415927

  number.toPrecision(precision)
  toPrecision方法把这个number转换成为一个十进制数形式的字符串。可选参数precision,控制数字精度。它的值必须在0~21

Math.PI.toPrecision() //3.141593  

  number.toString(radix)
  toString方法把这个number转换成为一个字符串。可选参数radix控制基数。它的指必须在2~36.

Math.PI.toString() //3.110375724102643

  ④Object

  Object.hasOwnProperty(name)
  如果这个object包含一个名为name的属性,那么hasOwnProperty方法返回true。原型链中的同名属性是不会被检查的。这个方法name就是"hasOwnPerperty"时不起作用,此时会返回false:

    var a = {member:true};
var b = object.create(a);
var t = a.hasOwnProperty('member'); //t是true
var u = b.hasOwnProperty('member'); //u是false
var v = b.member; //true

  

  ⑤RegExp

  RegExp.exec(string)
  exec方法是使用正则表达式的最强大和最慢的方法。如果它成功地匹配regexp和字符串String,它会返回一个数组。数组中下标为0的元素将包含正则表达式regexp匹配的字符串。下标为1的元素是分组1捕获的文本,下标为2的元素是分组2捕获的文本,以此类推。如果匹配失败,它会返回null。

  如果regexp带有一个g标识,事情会变得更加复杂。查找不是从这个字符串的起始位置开始,而是从regexp.lastIndex(初始值为0)位置开始。如果匹配成功,那么regexp.lastIndex将被设置为该匹配后第一个字符的位置。不成功的匹配会重置regexp.lastIndex为0。

  RegExp.test(string)
  test方法是使用正则表达式的最简单和最快的方法。如果该regexp匹配string,它返回true;否则,它返回false。

  ⑥String

  string.charAt(pos)
  charAt方法返回在string中pos位置处的字符。如果pos小于0或大于等于字符串的长度string.length,它会返回空字符串。javascript没有字符类型。

    例 var name = 'Curly';
var initial = name.charAt() //initial是 'C'

 

   string.charCodeAt(pos)

   chartCodeAt方法同charAt一样,只不过它返回的不是一个字符串,而是以整数形式表示的在string中的pos位置处的字符的字符码位。如果pos小于0或大于等于字符串的长度,则返回NaN。 

    例 var name = 'Curly';
var initial = name.charCodeAt(); //initial是67

  string.concat(string...)

  concat方法把其他的字符串连接在一起构造一个新的字符串。它很少被使用,因为用+运算符更方便。  

var s='C'.concat('a','t');      //s是cat

  

  string.indexOf(searchString,position)

  indexOf方法在string内查找另一个字符串searchString。如果它被找到,返回第1个匹配字符的位置,否则返回-1.可选参数position可设置从String的某个指定的位置开始查找:

例 var text = 'Mississippi',p = text.indexOf('ss',);

   string.lastIndexOf(search,position)

   lastIndexOf方法和indexof类似,只不过它是从该字符串的末尾开始查找而不是从开头。

  string.localeCompare(that)
  localeCompare方法比较两个字符串。

  strng.match(regexp)
  match方法让字符串和一个正则表达式进行匹配。它依据g标识来决定如何进行匹配。如果没有g标识,那么调用string.match(regexp)的结果与调用    regexp.exec(string)的结果相同。然而,如果带有g标识,那么它生成一个包含所有匹配(除捕获组之外)的数组。

  string.replace(searchValue,replaceValue)
  replace方法对string进行查找和替换操作,并返回一个新的字符串。参数searchValue可以是一个字符串或者一个正则表达式对象。

  string.search(regexp)
  search方法和indexOf方法类似,只是它接收一个正则表达式对象作为参数而不是一个字符串。如果找到匹配,它返回第1个匹配的首字符位置,如果没有找到匹配,则返回-1。此方法会忽略g标识,且没有position参数。

    例var text = 'and in it he says "Any damn fool could';
var pos = text.search(/["']/)

  string.slice(start,end)

  slice方法复制string的一部分来构造一个新的字符串。如果start参数是负数,它将与sting.length相加。end参数是可选的,且默认值是string.length.如果end参数是负数,那么它将与string.length相加。end参数等于你要取的最后一个字符的位置值加1.要想得到从位置p开始的n个字符,就用string.slice(p,p+n).

  string.split(separator,limit)

  split方法把这个string分割成片段来创建一个字符串数组。可选参数limit可以限制被分割的片段数量。separator参数可以是一个字符串或者一个正则表达式。

    例 var digits = '';
var a = digits.split('',); //a是['0,'1','2','3','4','5'];

  string.substring(start,end)
  substring的用法和slice方法一样,只是它不能处理负数参数。没有理由去使用substring方法。请使用slice替代它。

  string.toLocaleLowerCase()
  toLocaleLowerCase方法返回一个新字符串,它使用本地化的规则把这个string中的所有字母转换为小写格式。

  string.toLocaleUpperCase()
  toLocaleUpperCase()方法返回一个新字符串,它使用本地化规则把这个string中的所有字母转换为大写格式。

  string.toLowerCase()
  toLowerCase方法返回一个新的字符串,这个string中的所有字母都被转换为小写格式。

  string.toUpperCase()
  toUpperCase方法返回一个新的字符串,这个string中的所有字母都被转换为大写格式。

  String.fromCharCode(char.....)
  string.fromCharCode函数根据一串数字编码返回一个字符串

var a=String.fromCharCode(,,); //a是'Cat'

四、类型检测与转换的一些问题

  typeof
  typeof运算符返回一个用于识别其运算数类型的字符串。
  typeof null 检测出来的不是null,而是'object'
  typeof /a/ 通常检测结果为'object',但是safari 3.x版本系列中,返回为'function'
  一种通过typeof检测Array的方法,虽然不稳定,但是值得参考学习:

    if(my_value && typeof my_value === 'object' && my_value.constructor === Array){
//my_value是一个数组
}

  

  NaN 
  NaN是一个特殊的数值量,它表示的不是一个数字,但是我们用typeof检测时发现一个奇怪的现象:
  typeof NaN === 'Number'; //结果为true
  typeof不能辨别数字和NaN,而且NaN也不等同于它自己
  NaN === NaN //false
  NaN !== NaN //true
  javascript提供了一个isNaN函数,可以辨别数字与NaN,通过isNaN()方法检测会对传入的参数做强类型转换:
  isNaN(NaN) //true
  isNaN(0) //false
  isNaN('oops') //true 强类型转换
  isNaN('0') //false 强类型转换
  判断是否为数字的isNumber函数:

  var isNumber = function(value){
    return typeof value === 'Number' && isFinite(value);
  }

  

  伪数组
  javascript没有真正的数组。javascript的数组确实非常容易使用。我们通常所使用的数组地底层是有Object产生的。
  检测数组

if(Object.prototype.toString.call(my_value) === '[object Array]'){
// my_value确实是一个数组
}

  

  假值
  javascript拥有一组数量奇大的假值
  值               类型
  0              Number
  NaN(非数字)      Number
  ''(空字符串)       String
  false         Boolean
  null          Object
  undefined        Undefined
  这些值全部都等同于假,但不可互换。

五、==和!=, ===和!==,同类型==没有转换(注意)

  '' == ''         //false
== '' //true
== '' //true false == 'false' //false
false == '' //true false == undefined //false
false == null //false
null == undefined //true '\t\r\n' == false //true

  “==”的操作的规则:

  1.如果两个操作数的类型相同,则按照严格相等的比较规则。如果严格相等,那么比较结果为相等。如果它们不严格相等,则比较结果为不相等。

  2.如果两个操作数类型不同,"=="相等操作符也可能会认为它们相等。检测相等将会遵循如下规则和类型转换:

    -如果一个是null,另一个为undefined,则它们相等。

    -如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。

    -如果其中一个值为true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较。

    -如果一个值是对象,另一个值是数字或字符串。将对象转换为原始值,然后再进行比较。对象通过toString()方法或者valueOf()方法转换为原始值。javascript语言核心的内置类首先尝试使用valueOf(),再尝试使用toString(),除了日期类,日期类只使用toString()转换。那些不是javascript语言核心中的对象则通过各自的实现中定义转换为原始值。

    -其他不同类型之间的比较均不相等。

  最后一个疑问,就是js sort()的排序原理问题,好像是哈希表,但也看到是Bubble,希望哪位大神帮我解答,谢谢!

  常见问题:社区乱炖

      学习js比较好的网站

读《javascript语法精粹》知识点总结的更多相关文章

  1. JavaScript语言精粹知识点总结

    1.NaN是一个数值,它表示一个不能产生正常结果的运算结果.NaN不等于任何值,包括它自己. 2.Infinity表示所有大于1.79769313486231570e+308的值,所以Infinity ...

  2. [已读]javascript语言精粹

    又是一本广为赞颂的好书,当时才刚开始学,啃这本书的时候于是比较困难.记得是有介绍一些js中的“精华”与“糟粕”.

  3. 读阮一峰对《javascript语言精粹》的笔记,我有疑问。

    <javascript语言精粹>是一本很棒的书籍,其中作者在附录列出了12种他所认为的javascript语言中的糟粕. 我最近开始跟读前端前辈的博客,其中读到了阮一峰的<12种不宜 ...

  4. 读《JavaScript语言精粹》的一些感言

    最近看了<JavaScript语言精粹>,并且连着看了两遍,如果非要用言语形容的话,那我只能用4个字来形容:相见恨晚.其中的一些经验经过这么多年的摸索其实也了然,但是作者用这么浅薄的书把有 ...

  5. JavaScript语言精粹 笔记01 语法 对象

    内容比较简单,只是从头梳理一下JS的知识 语法空白标识符数字字符串语句 对象对象字面量检索更新引用原型反射枚举删除减少全局变量污染  语法 1 空白 空白可能表现为格式化字符或注释的形式.空白通常没有 ...

  6. 这几种JavaScript语法不要轻易使用,容易出事

    文章目录 12种不宜使用的JavaScript语法 1. == 2. with 3. eval 4. continue 5. switch 贯穿 6. 单行的块结构 7. ++和-- 8. 位运算符 ...

  7. 《JavaScript语言精粹》小记

    一.前言 以下内容均摘自<JavaScript语言精粹>一书,本人在读这本书时,发现作者诠释JavaScript很犀利,特别是数组部分,固记录下来,想和大家分享下. 随笔主要包含两大部分: ...

  8. javascript语言精粹

    内容选自:<javascript语言精粹> 1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN 2.typeof有6种值,分别是'num ...

  9. javascript数组的知识点讲解

    javascript数组的知识点讲解 阅读目录 数组的基本方法如下 concat() join() pop() push() reverse() shift() sort() splice() toS ...

随机推荐

  1. 尚未备份数据库 "***" 的日志尾部。如果该日志包含您不希望丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 备份该日志。

    使用SQL Server 2005还原备份的数据库文件时出现的问题,如题. 前提:如果你有个数据库的.bak的备份文件. 右键点击 数据库任务-->还原-->数据库 1.还原的目标选择你要 ...

  2. 配置带用户权限的docker registry v2

    v1版本的docker registry用nginx配置,v2版本的用nginx有些问题,客户端总是会请求到v1/下面去, 以下从 http://blog.csdn.net/felix_yujing/ ...

  3. &lt;climits&gt;头文件定义的符号常量

    <climits>头文件定义的符号常量 CHAR_MIN  char的最小值 SCHAR_MAX  signed char 最大值 SCHAR_MIN   signed char 最小值 ...

  4. 解决 安装VMwanre tools时 Enter the path to the kernel header files for the 3.10.0-862.14.4.el7.x86_64 kernel

    1.使用ctrl+z停止安装vmtools安装 2.然后yum升级kernel-devel yum -y install kernel-devel

  5. eureka服务注册发现流程和核心参数

    参数1:eureka.instance.lease-renewal-interval-in-seconds 参数2:eureka.instance.lease-expiration-duration- ...

  6. mysql分组用法

    --select num from 表 group by num --select num from 表 group by num,nid --特别的:group by 必须在where之后,orde ...

  7. alpine-bash镜像制作

    alpine轻量级基于busybox的发行版,特别适合基于docker的base images. 特点: small.simple.secure 官方地址: https://alpinelinux.o ...

  8. Java数据结构之LinkedList、ArrayList的效率分析

    前言: 在我们平常开发中难免会用到List集合来存储数据,一般都会选择ArrayList和LinkedList,以前只是大致知道ArrayList查询效率高LinkedList插入删除效率高,今天来实 ...

  9. css 定位(fixed > absolute > relative)与层级zIndex 的权限认知

    原则1: fixed > absolute > relative原则2: zIndex 越高越牛逼,不管你是谁无视身份.原则3: 青出于蓝而胜于蓝,儿子永远比父亲强原则4: 平台很重要. ...

  10. CZT变换(chirp z-transform)

    作者:桂. 时间:2018-05-20  12:04:24 链接:http://www.cnblogs.com/xingshansi/p/9063131.html 前言 相比DFT,CZT是完成频谱细 ...