【JavaScript】JS的坚实基础
前言
考虑到在后面的开发中,需要大量的使用js语言去进行开发,所以准备重新规整一下javascript的知识点,专门开了一个js的专栏,用来复习一下js语言。万事开头难,要是后面写的有问题的,欢迎大家在下方无情抽脸!!!
数据类型
在JavaScript
中大体存在2大类数据类型,值类型
与引用类型
;
值类型:
String
、Number
、Boolean
、Null
、Undefined
以及Symbol
值类型是按值存储,数据存储在内存栈中,
Number
,String
,Boolean
,Symbol
都对应了一个包装对象,例如:new Number(5)
这也是能用原始数据类型调用方法的原理:eg:
('happy').toString()
,'happy'是一个基本数据类型,本身没有toString的这个方法,所以通过调用ToObject [spec]将值转换为对象,然后去它的包装对象new String('happy')中调用,调用完成后包装对象就会消失,下次需要就会重新创建。引用类型:
Object
、Array
、Function
引用类型按引用存储的,存储的不是值,而是一个地址,数据存储在内存堆中
数据类型检测常用方法
typeof
主要用于原始类型的检测
typeof 'seymoe' // 'string'
typeof true // 'boolean'
typeof 10 // 'number'
typeof Symbol() // 'symbol'
typeof null // 'object' 无法判定是否为 null
typeof undefined // 'undefined'
typeof {} // 'object'
typeof [] // 'object'
typeof(() => {}) // 'function'
instanceof
主要用于检测自定义对象
// 测试构造函数的prototype是否在被检测对象obj的原型链上面
// obj instanceof 构造函数的prototype
[] instanceof Array// true
({}) instanceof Object// true
(()=>{}) instanceof Function// true
Object.prototype.toString.call
数据类型判断的终极方法该方法本质就是依托
Object.prototype.toString()
方法得到对象内部属性[[Class]]
传入原始类型却能够判定出结果是因为对值进行了包装
null
和undefined
能够输出结果是内部实现有做处理
// Object.prototype.toString.call(obj)
Object.prototype.toString.call({}) // '[object Object]'
Object.prototype.toString.call([]) // '[object Array]'
Object.prototype.toString.call(() => {}) // '[object Function]'
Object.prototype.toString.call('seymoe') // '[object String]'
Object.prototype.toString.call(1) // '[object Number]'
Object.prototype.toString.call(true) // '[object Boolean]'
Object.prototype.toString.call(Symbol()) // '[object Symbol]'
Object.prototype.toString.call(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'
Object.prototype.toString.call(new Date()) // '[object Date]'
Object.prototype.toString.call(new Math()) // '[object Math]'
Object.prototype.toString.call(new Set()) // '[object Set]'
Object.prototype.toString.call(new WeakSet()) // '[object WeakSet]'
Object.prototype.toString.call(new Map()) // '[object Map]'
Object.prototype.toString.call(new WeakMap()) // '[object WeakMap]'
var、let和const
最开始使用javascript
的时候var
耍的那叫一个炉火纯青,等es6出来后提供的let
和const
关键字一开始觉得没有var
好用,等实际用过后才发现真香!!!(≖ᴗ≖)✧基本现在var
已经给淘汰了。
var
:全局作用域(函数内),声明存在变量提升,好用是好用,难受也难受!执行
javascript
代码时会分为俩个阶段,预编译阶段
和运行时阶段
,其中在预编译阶段时候会进行变量声明提升,意思就是会将
var
定义的变量声明放到代码顶部,变量赋值则是在代码运行时阶段进行,可以通过下面的实例来理解一下JS执行时的变量提升。console.log(a);
var a = 0; // 等价于
var a = undefined;
console.log(a);
a = 0;
当然,除了变量提升外,函数提升也是一样的,大家感兴趣的可以自己试一下。
function fun() {} // 这种声明写法会导致函数提升,所以不论声明在什么位置,都可以调用它,且它本身不会执行 var foo = function(){} // 这种写法会导致变量提升,但是不会导致函数提升,这时候就必须先声明再调用
let
:块级作用域,可以看成{}
形成一个块级作用域首先
let
声明变量不会进行变量提升,也就是说如果想要使用let
声明的变量,必须在使用之前声明该变量;在for循环中可以通过
let
来给每一次循环时的变量分配各自作用域,从而互不影响。// 不存在变量提升
console.log(a); // a is not defined.
let a = 1; // 块级作用域
let b = 1;
{
console.log(b) // 1 作用域内可以访问作用域外申明的变量
let c = 1;
}
console.log(c) // c is not defined. 作用域外访问不到作用域内申明的变量
const
:块级作用域和
let
关键字一样会形成块级作用域,但是const
通常用来声明一个常量!对于栈存储类型数据来说,通过const申明赋值之后便不可更改;
对于堆存储类型数据来说,通过const申明赋值之后堆引用地址不可更改,但是可以更改堆地址对应的数据(比如对象的属性,数组的选项等!)
字符串API
str.split('-') //按-分割字符串返回一个数组
str.substr(startIndex , count) //返回截取的新字符串
str.substring(startIndex , endIndex) //返回新字符串(包括startIndex不包括endIndex)
str.slice(startIndex , endIndex) //返回新字符串(包括startIndex不包括endIndex)
str.repalce(旧字符串 , 新字符串) //替换字符串
str.toLowerCase() //转小写
str.toUpperCase() //转大写
str.trim() //去除两端空格
str.charAt ( index ) //返回index位置的字符
str.concat ( str1 , str2 , ...) //返回拼接后的新字符串
str.indexOf (str1 , startIndex) //返回str1的位置索引,没有返回-1
str.lastIndexOf ( str1 ) //从后向前找返回str1的位置索引,没有返回-1
数字API
Math.abs(x) //返回 x 的绝对值。
Math.ceil(x) //返回 x,向上舍入为最接近的整数。
Math.floor(x) //返回 x,向下舍入为最接近的整数。
Math.max(x, y, z, ..., n) //返回值最大的数字。
Math.min(x, y, z, ..., n) //返回值最小的数字。
Math.pow(x, y) //返回 x 的 y 次幂值。
Math.random() //返回 0 到 1 之间的随机数。
Math.round(x) //将 x 舍入为最接近的整数。
Math.trunc(x) //返回数字 (x) 的整数部分。
数组API
// splice会改变原始数组
array.splice(startIndex , deleteCount , item1,item2, ...) // 一般用于删除元素(也可替换(插入)元素)
// slice返回一个新数组
array.slice(?startIndex , ?endIndex) // 截取的数组值放入一个新的数组中(不包括endIndex位置的元素)
// includes:ES7中的,判断该数组中是否包含指定的值
array.includes(elem,[startIndex])
// 和indexOf的区别是includes可以发现NaN,而indexOf不能
[NaN].includes(NaN) // true
[NaN].indexOf(NaN) // -1
array.concat(array1 , array2 , ...) // 组合返回新数组
array.push( item ) // 插入数组最后位置,返回数组新的长度
array.pop() // 删除数组最后一个元素,返回删除的这个元素值
array.shift() // 删除数组的第一个元素,返回删除的这个元素值
array.unshift( item ) // 在数组第一个元素之前插入新元素,返回新数组的长度
array.join('-') // 以-将数组每一项拼成一个字符串,返回拼凑好的字符串
// array.join() array.toString()
array.reverse() // 反转数组并返回
array.sort(function(a, b) { return a-b;}) // 排序(升序)
// 循环遍历
array.forEach(function(value){})
array.forEach(function(value,index,newArray){})
// Map遍历数组的每一项,把执行后的结果全部插入一个新的数组中并返回
array.map(function(value){
return value*2;
})
// Filter返回符合条件的值组成的新数组
array.filter(function(value){
return value>3;
})
// Every返回true/false(只有数组每一项都符合条件才会返回true)【确定了结果就会停止遍历】
array.every(function(value){
return value>0;
})
// Some返回true/false(只要数组中有一项满足条件就会返回true)【确定了结果就会停止遍历】
array.some(function(value){
return value>0;
})
// indexOf()返回查找元素从前往后的第一个元素位置索引
var index = ['tang','fu','qiang','fu'].indexOf('fu'); // index为1;
// lastIndexOf()返回查找元素从后往前的第一个元素位置索引
var lastIndex = ['tang','fu','qiang','fu'].lastIndexOf('fu'); // lastIndex为3
// Array.from方法将俩类对象转化为真正的数组。
// 类似于数组的对象 和 可遍历(Iterable)的对象(包括ES6中的数据结构Set和Map)
Array.from(new FormData(from))
对象API
Object.keys(obj) // 方法会返回由一个给定对象的自身【可枚举属性】组成的数组
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); --- ['0', '1', '2']
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']
Object.assign() // 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。eg: Object.assign(target, ...sources)
Object.getPrototypeOf(obj) // 返回指定对象的原型(内部[[Prototype]]属性的值)
obj.hasOwnProperty(prop) // 返回一个布尔值,指示对象自身属性中是否具有指定的属性。
Object.create(创建对象的原型 , {对象自身可枚举属性(可选)} ) // eg: Object.create(Array.prototype)
Object.defineProperty(Obj, prop, descriptor) // 返回被修改的对象
descriptor:
value:默认undefined,该属性对应的值,可以是任何有限的JavaScript值,(函数、数字、对象等)
writable:默认false,设置为true时value才能够被赋值运算符改变
configurable:默认为false不可修改,设置为true可以修改,也能删除该属性
enumerable:默认为false,设置为true该属性才能够出现在对象的枚举属性中
//循环遍历:
// for in: 遍历时候不仅能读取对象自身的成员属性,还可以读取原型链上对象的原型属性,所以可以使用hasOwnProperty判断一个属性是不是自身上的属性,返回true表示这个属性是对象的成员属性,不是原型属性
for(key in obj){
if(obj.hasOwnProperty(key)){
object[key] = 1;
}
}
// for of:遍历所有数据机构的统一方法
// 一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,就可以用for...of来遍历它的成员,也就是说,for...of循环内部调用的是数据结构的Symbol.iterator方法
日期API
const myDate = new Date([params]); // params可取值(月份0~11):空 2019,9,20 '2019/9/20' '2019-9-20' '2019-9-20 17:27:30'
myDate.getYear(); //获取当前年份(2位)
myDate.getFullYear(); //获取完整的年份(4位,1970-????)
myDate.getMonth(); //获取当前月份(0-11,0代表1月)
myDate.getDate(); //获取当前日(1-31)
myDate.getDay(); //获取当前星期X(0-6,0代表星期天)
myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数)
myDate.getHours(); //获取当前小时数(0-23)
myDate.getMinutes(); //获取当前分钟数(0-59)
myDate.getSeconds(); //获取当前秒数(0-59)
myDate.getMilliseconds(); //获取当前毫秒数(0-999)
myDate.toLocaleDateString(); //获取当前日期
myDate.toLocaleTimeString(); //获取当前时间
myDate.toLocaleString( ); //获取日期与时间
总结
以上就是总结的javascript
基础中一部分了,关于javascript
基础还有很多内容,这边就不再详细介绍了,下一篇讲一下JS的事件循环(Event Loop),感兴趣的小伙伴可以关注一下,想要了解哪些内容也可以下方评论留言,以上内容如有错误也可以留言告知本人。ヽ( ̄▽ ̄)ノ
【JavaScript】JS的坚实基础的更多相关文章
- javascript(js)小数精度丢失的解决方案
原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况. javascript(js)的小数点加减乘除问题,是一个js的bug如0.3* ...
- JavaScript对象属性的基础教程指南
JavaScript是使用“对象化编程”的,或者叫“面向对象编程”的.所谓“对象化编程”,意思是把JavaScript能涉及的范围划分成大大小小的对象,对象下面还继续划分对象直至非常详细为止,所有的编 ...
- JavaScript(js)/上
JavaScript(js) ECMA-----定义的基础语法 DOM------document object model BOM------Browser object model Jav ...
- 【HANA系列】SAP HANA XS使用JavaScript(JS)调用存储过程(Procedures)
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...
- JavaScript js调用堆栈(二)
本文主要介绍JavaScript的内存空间 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 首先需要对栈(stack),堆(hea ...
- 【HANA系列】【第六篇】SAP HANA XS使用JavaScript(JS)调用存储过程(Procedures)
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第六篇]SAP HANA XS ...
- [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析
[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...
- Javascript面向对象编程一:基础篇
该随笔分为以下四部分: Javascript面向对象编程一:基础篇 Javascript面向对象编程二:封装 Javascript面向对象编程三:继承 Javascript面向对象编程四:控件 先弄个 ...
- 【转】关于URL编码/javascript/js url 编码/url的三个js编码函数
来源:http://www.cnblogs.com/huzi007/p/4174519.html 关于URL编码/javascript/js url 编码/url的三个js编码函数escape(),e ...
随机推荐
- python学习笔记(十二)-网络编程
本文结束使用 Requests 发送网络请求.requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到.可以说,Requests 完全满足如今网络的需求. ...
- CI框架 core
https://blog.csdn.net/admin_admin/article/details/51769805 1.扩展控制器 1.在application/core新建一个自己的控制器(MY_ ...
- java基础面试题(一)
1.java中的数据类型,各占多少个字节? 2.面向对象的特性 1-封装:简单来说,封装就是把数据和操作数据的方法绑定起来,如果需要访问,可以使用已定义的接口进行访问 2-继承:从已有的类得到继承信息 ...
- ARC106E-Medals【hall定理,高维前缀和】
正题 题目链接:https://atcoder.jp/contests/arc106/tasks/arc106_e 题目大意 \(n\)个员工,第\(i\)个在\([1,A_i]\)工作,\([A_i ...
- CF1375F-Integer Game【交互】
正题 题目链接:https://www.luogu.com.cn/problem/CF1375F 题目大意 给出\(a,b,c\).先手每次指定一个数\(k\),然后后手指定一个数字加上\(k\),若 ...
- WPF进阶技巧和实战03-控件(1-控件及内容控件)
所有控件都继承自System.Windows.Controls.Control类,这个类添加一些基本结构: 设置控件内容对齐方式 (HorizontalContentAlignment,Vertica ...
- NLP与深度学习(五)BERT预训练模型
1. BERT简介 Transformer架构的出现,是NLP界的一个重要的里程碑.它激发了很多基于此架构的模型,其中一个非常重要的模型就是BERT. BERT的全称是Bidirectional En ...
- amber模拟kcl水溶液
最近刚开始学习amber软件,看网上的教程勉强知道怎么操作这个amber了.就暂时跑了个分子动力学,其他的啥也没处理.先把我的操作过程记录下来吧,免得日后忘记. 一.构建kcl.pdb结构 利用Gau ...
- Python技法-序列拆分
Python中的任何序列(可迭代的对象)都可以通过赋值操作进行拆分,包括但不限于元组.列表.字符串.文件.迭代器.生成器等. 元组拆分 元组拆分是最为常见的一种拆分,示例如下: p = (4, 5) ...
- rocketmq高可用集群部署(RocketMQ-on-DLedger Group)
rocketmq高可用集群部署(RocketMQ-on-DLedger Group) rocketmq部署架构 rocketmq部署架构非常多,都是为了解决一些问题,越来越高可用,越来越复杂. 单ma ...