学习笔记——JS语言精粹
JS作用域是基于词法作用域的顶级对象。
JS是一门弱类型语言,强类型能在编译时检测错误。
JS是唯一一门所有浏览器都能识别的语言。
块注释对于被注释的代码是不安全的,例如/* var rm=/a*/.match(s); */
JS只有一个数字类型,没有分离出整数类型,完全避免了短整型的溢出问题。
NaN不等于任何值,包括他自己。
JS所有字符都是16位。
JS允许数组包含任意类型的值。
字符串是不可变的,一旦被创建,永远无法改变它,但是可以通过+运算符连接其他字符串来创建一个新字符串。
2个包含着完全相同的字符且字符顺序也相同的字符串被认为是相同的字符串,所以'c'+'a'==='ca'是true
switch,while,for,do语句配合break语句来使用。
falsy的值:
- false
- null
- undefined
- 空字符串''
- 数字0
- 数字NaN
其他都被当做真。
for in会枚举一个对象的所有属性名(键名),需要object.hasOwnProperty(variable)来确定这个属性名是该变量对象的成员还是来自原型链。
do在代码块执行后再检测,while在执行前检测。
+运算符可以进行加法运算或字符串连接。如果想加法运算,两个运算数都得是数字。
如果第1个运算数的值为假,运算符&&产生第1个运算数的值,否则产生第2个运算数的值。
如果第1个运算数的值为真,运算符||产生第1个运算数的值,否则产生第2个运算数的值。
JS简单数据类型包括数字,字符串,布尔值,null值,undefined值,其他所有的值都是对象。
检索方式:
- []
- .(优先考虑)
如果字符串是合法的JS标识符且不是保留字,那么也可以用.来检索。
||可以填充默认值:var middle=stooge["middle-name"]||"(none)";
对象里的值可以通过赋值语句来更新,如果属性名已存在对象里,那么这个属性的值就会被替换。如果对象之前没有那个属性名,那么该属性就扩充到对象中。
Object.create()可以创建一个使用原对象作为其原型的新对象。
delete运算符可以用来删除对象的属性。如果对象包含该属性,那么该属性会被移除。它不会触及原型链中的任何对象。删除对象的属性可能会让来自原型链中的属性透显出来。
对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype。每个函数在创建时会附加2个隐藏属性:函数上下文和实现函数的代码。
当实参的个数>形参的个数,超出的参数值被忽略。
当实参的个数<形参的个数,缺失的参数值被替换为undefined。
- 方法调用模式。就是一个函数被保存为对象的一个属性。当一个方法被调用时,this被绑定到该对象。this到对象的绑定发生在调用的时候。
- 函数调用模式。this被绑定到全局对象,可以通过定义一个变量that保存this。
- 构造器调用模式。如果在一个函数前面加上new来调用,会创建一个连接到该函数的prototype成员的新对象,同时this被绑定到那个新对象上。
- apply调用模式。apply接收2个参数,第1个是要绑定给this的值,第2个是一个参数数组。
当函数被调用,可以通过arguments数组来访问到所有它被调用时传递给它的参数列表。(包括实参>形参,超出的实参)
throw语句中断函数的执行,它会抛出一个exception对象,该对象包含一个用来识别异常类型的name属性和message属性。这个exception对象会被传递到try的catch从句。
var add=function (a,b){
throw{
name:'TypeError',
message:'add needs numbers'
};
}
var try_it=function(){
try{
add('7');
}cache(e){
document.write(e.name+':'+e.message);
}
}
移除首尾空格的方法:
String.method('trim',function(){
return this.replace(/^\s+|\s+$/g,'');
}
要确定没有该方法时才添加方法:Function.prototype.method=function(name,func){}
使用函数和闭包来构造模块。
级联可以在一个语句中一次调用同一个对象的很多方法。A.().B().C()
柯里化(局部套用),把多参数函数转换为一系列单参数函数并进行调用的技术。
记忆:将先前的操作结果记录在某个对象里,避免无谓的重复计算。比如斐波那契数列。
优化前:
var fib=function(n){
return n<2?n:fib(n-1)+fib(n-2);
}
for(var i=0;i<=10;i++){
console.log(fib(i));
}
优化后:
var memoizer=function(memo,formula){
var fib=function(n){
var result=memo[n];
if(typeof result !=='number'){
result=fib(n-1)+fib(n-2);
memo[n]=result;
}
return result;
};
return fib;
};
var fibb=memoizer([0,1],function(fib,n){
return fib(n-1)+fib(n-2);
});
当一个函数对象被创建时,构造器产生的函数对象赋予一个prototype属性,它的值是一个包含constructor属性且属性值为该新函数的对象。
用new调用一个函数时,函数执行方式:1.创建一个新对象,继承自构造器函数的原型对象 2.调用构造器函数,绑定this到新对象上 3.如果它的返回值不是一个对象,就返回该新对象。
差异化继承:
var myMammal={
name:'hello',
get_name:funcrion(){
return this.name;
},
says:function(){
return this.saying||'';
}
}
var myCat=Object.create(myMammal);
myCat.name='world';
myCat.saying='meow';
数组的长度length:length的属性值时这个数组的最大整数属性名+1,它不一定等于数组里的属性个数。arr[100001]=true; arr.length//100002
设置更大的length不会为数组分配更多的空间,设置更小的length会把>=新length的属性删除。
for in遍历无法保证顺序,而且在原型上加扩展方法会被for in出来。所以最好用hasOwnProperty()判断。
学习笔记——JS语言精粹的更多相关文章
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
- [java学习笔记]java语言核心----面向对象之构造函数
1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用: 给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
- amazeui学习笔记--js插件(UI增强)--警告框Alert
amazeui学习笔记--js插件(UI增强)--警告框Alert 一.总结 1.警告框基本样式:用am-alert声明div容器, <div class="am-alert" ...
- amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown
amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown 一.总结 1.am-dropdown(及其孩子):控制下拉列表的样式 2.data-am-dropdown(及其孩子):控 ...
- amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse
amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse 一.总结 注意点: 1.data-am-collapse:这个东西就是展开折叠事件 2.am-collapse(包括其下属 ...
- amazeui学习笔记--js插件(UI增强2)--按钮交互Button
amazeui学习笔记--js插件(UI增强2)--按钮交互Button 一.总结 1.按钮loading状态: <button type="button" class=&q ...
随机推荐
- 去年去阿里面试,被问到ArrayList和LinkedList,我是这样回答的!
前言 在一开始基础面的时候,很多面试官可能会问List集合一些基础知识,比如: ArrayList默认大小是多少,是如何扩容的? ArrayList和LinkedList的底层数据结构是什么? Arr ...
- Mac下载工具folx如何下载常用的软件
最近,多档综艺节目都开展得如火如荼,比如<中国新说唱>.<这就是街舞>等深受年轻人喜欢的综艺节目.虽然手机端也可观看,但可以的话,当然是使用电脑屏幕观看节目比较过瘾. 接下来, ...
- 怎么让我们的mac运行得更加流畅?让我们得工作事半功倍!
古语云:"工欲善其事,必先利其器."因此,一个运行流畅的Mac更能使我们的工作事半功倍.但又是什么导致电脑的运行不流畅呢? 其实这大多还是缓存垃圾过多.内存不足的原因.尝试安装了许 ...
- leetcode 108 和leetcode 109 II
//感想:没啥上篇写完了 //思路:对于这道题109来说,就是数组变成了链表,其他没有变,我觉得非常不解,因为我想到的依旧是找中点,用快慢指针来找, 找到以后将链表分成两半,继续递归的去找,我就觉得这 ...
- zabbix 用Telegram报警!!!
第一步:先在Telegram 注册个机器人!!! @BotFather在Telegram中添加联系人并按"开始",然后键入: /newbot输入你要新建的机器人名称在电报中@你的机 ...
- mybatis 动态SQL 源码解析
摘要 mybatis是个人最新喜欢的半自动ORM框架,它实现了SQL和业务逻辑的完美分割,今天我们来讨论一个问题,mybatis 是如何动态生成SQL SqlSessionManager sqlSes ...
- kubelet CPU 使用率过高问题排查
kubelet CPU 使用率过高问题排查 问题背景 客户的k8s集群环境,发现所有的worker节点的kubelet进程的CPU使用率长时间占用过高,通过pidstat可以看到CPU使用率高达100 ...
- 微前端大赏二-singlespa实践
微前端大赏二-singlespa实践 微前端大赏二-singlespa实践 序 介绍singleSpa singleSpa核心逻辑 搭建环境 vue main react child 生命周期 结论 ...
- 【译】理解Rust中的局部移动
原文标题:Understanding Partial Moves in Rust 原文链接:https://whileydave.com/2020/11/30/understanding-partia ...
- java导出excel并且压缩成zip上传到oss,并下载,使用字节流去存储,不用文件流保存文件到本地
最近项目上要求实现导出excel并根据条数做分割,然后将分割后的多个excel打包成压缩包上传到oss服务器上,然后提供下载方法,具体代码如下:这里只展示部分代码,获取数据的代码就不展示了 ByteA ...