02-数据的赋值
title: 02-数据的赋值publish: true
对象赋值用 Object.assgin() 实现浅拷贝代码举例:
const obj1 = { name: 'qianguyihao', age: 28, desc: 'hello world',};const obj2 = { name: '许嵩', sex: '男',};// 【关键代码】浅拷贝:把 obj1 赋值给 obj2。这行代码的返回值也是 obj2Object.assign(obj2, obj1);console.log(JSON.stringify(obj2));
打印结果:
{"name":"qianguyihao","sex":"男","age":28,"desc":"hello world"}
...
03-Ajax传输json和XML
title: 03-Ajax传输json和XMLpublish: true
Ajax 传输 JSONJSON 的语法JSON(JavaScript Object Notation):是 ECMAScript 的子集。作用是进行数据的交换。语法更为简洁,网络传输、机器解析都更为迅速。
语法规则:
数据在键值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
数据类型:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在方括号中)
对象(在花括号中)
null
示例:
// 对象{ "name":"fox", "age":"18", "sex":"true", "car":null}// 数组[ { "name":"小小胡", "ag ...
03-ES5中的一些扩展
title: 03-ES5中的一些扩展publish: true
JSON 对象1、js对象(数组) –> json对象(数组):
JSON.stringify(obj/arr)
2、json对象(数组) –> js对象(数组):
JSON.parse(json)
上面这两个方法是ES5中提供的。
我们要记住,我们通常说的“json字符串”,只有两种:json对象、json数组。
typeof json字符串的返回结果是string。
Object的扩展ES5给Object扩展了一些静态方法,常用的有2个,我们接下来讲解。
方法一Object.create(prototype, [descriptors])
作用: 以指定对象为原型,创建新的对象。同时,第二个参数可以为为新的对象添加新的属性,并对此属性进行描述。
举例1:(没有第二个参数时)
var obj1 = {username: 'smyhvae', age: 26};var obj2 = {address:'shenzhen' ...
03-创建对象和继承
title: 03-创建对象和继承publish: true
创建对象的几种方式通过Object<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>01_Object构造函数模式</title></head><body><!--方式一: Object构造函数模式 * 套路: 先创建空Object对象, 再动态添加属性/方法 * 适用场景: 起始时不确定对象内部数据 * 问题: 语句太多--><script type="text/javascript"> /* 一个人: name:"Tom", age: 12 */ // 先创建空Object对象 var p = new Object() p = {} //此时内部数据是不确定的 ...
03-变量的数据类型:基本数据类型和引用数据类型
title: 03-变量的数据类型:基本数据类型和引用数据类型publish: true
变量的数据类型为什么需要数据类型在计算机中,不同的数据所需占用的存储空间不同,为了充分利用存储空间,于是定义了不同的数据类型。而且,不同的数据类型,寓意也不同。
我们都知道,无论这个变量是字符串类型,还是数字类型,我们都可以直接用 var 去定义它。比如:
var a = 'hello word';var b = 123;
为什么可以这样做呢?这是因为:JavaScript 是一种「弱类型语言」,或者说是一种「动态语言」,这意味着不需要提前声明变量的类型,在程序运行过程中,类型会自动被确定。
JS 的变量数据类型,是在程序运行的过程中,根据等号右边的值来确定的。而且,变量的数据类型是可以变化的。比如说:
var name = 'qianguyihao';name = 123; // 强制将变量 name 修改为 数字类型
JS中一共有六种数据类型
基本数据类型(值类型):String 字符串、Number 数值、Boolean 布尔值、Null 空值 ...
04-ES6:变量 let、const 和块级作用域
title: 04-ES6:变量 let、const 和块级作用域publish: true
ES6 的变量声明ES5 中,使用 var 定义全局变量( var 是 variable 的简写)。
ES6 中,新增了 let 和 const 来定义变量:
let:定义局部变量,替代 var。
const:定义常量(定义后,不可修改)。
1、var:定义全局变量看下面的代码:
{ var a = 1;}console.log(a); //这里的 a,指的是 区块 里的 a
上方代码是可以输出结果的,输出结果为 1。因为 var 是全局声明的,所以,即使是在区块里声明,但仍然在全局起作用。
也就是说:使用 var 声明的变量不具备块级作用域特性。
再来看下面这段代码:
var a = 1;{ var a = 2;}console.log(a); //这里的 a,指的是 区块 里的 a
上方代码的输出结果为 2 ,因为 var 是全局声明的。
总结:
用 var 定义的全部变量,有时候会污染整个 js 的作用域。我们在 ...
04-作用域和闭包
title: 04-作用域和闭包publish: true
前言面试问题:
说一下对变量提升的理解
说明this的几种不同的使用场景
创建10个<a>标签,点击的时候弹出来对应的序号
如何理解作用域
实际开发中闭包的应用
涉及到的知识点:
执行上下文
this
作用域
作用域链
闭包
执行上下文执行上下文主要有两种情况:
全局代码: 一段<script>标签里,有一个全局的执行上下文。所做的事情是:变量定义、函数声明
函数代码:每个函数里有一个上下文。所做的事情是:变量定义、函数声明、this、arguments
PS:注意“函数声明”和“函数表达式”的区别。
全局执行上下文在执行全局代码前将window确定为全局执行上下文。
(1)对全局数据进行预处理:(并没有赋值)
var定义的全局变量==>undefined, 添加为window的属性
function声明的全局函数==>赋值(fun), 添加为window的方法
this==>赋值(window)
(2)开始执行全局代码
函数执行上下 ...
04-同源和跨域
title: 04-同源和跨域publish: true
同源和跨域同源同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。
跨域问题的解决方案从我自己的网站访问别人网站的内容,就叫跨域。
出于安全性考虑,浏览器不允许ajax跨域获取数据。
iframe:处于安全性考虑,浏览器的开发厂商已经禁止了这种方式。
JSONP:script 标签的 src 属性传递数据。
JSONPJSONP(JSON with Padding):带补丁的 json,本质是利用了 <script src=""></script>标签具有可跨域的特性,由服务端返回一个预先定义好的JS函数的调用,并且将服务器数据以该函数参数的形式传递过来。此方法需要前后端配合完成。
我们知道, html标签的 src 属性是支持跨域的:
<img src="http://img.smyhvae.com/2016040101.jpg" alt="">
jsonp 就是利用这个特性实现的跨域,但用的是 ...
04-基本数据类型:String 和 Boolean
title: 04-基本数据类型:String 和 Booleanpublish: true
今天这篇文章,我们详细讲一下基本数据类型。
String 字符串语法字符串型可以是引号中的任意文本,其语法为:双引号 "" 或者单引号 ''。
来看个示例。下面的这些,都是字符串:
var a = "abcde";var b = "千古壹号";var c = "123123";var d = '哈哈哈哈哈';var e = ""; //空字符串var f = haha; // 没使用引号,到这里会直接报错。因为会被认为是js代码,但是之前并没有定义 haha。console.log(typeof a);console.log(typeof b);console.log(typeof c);console.log(typeof d);console.log(typeof e);
控制台输出如下:
stringstringstringstringst ...
05-ES6:变量的解构赋值
title: 05-ES6:变量的解构赋值publish: true
解构赋值的概念解构赋值:ES6 允许我们,按照一一对应的方式,从数组或者对象中提取值,再将提取出来的值赋值给变量。
解构:分解数据结构;赋值:给变量赋值。
解构赋值在实际开发中可以大量减少我们的代码量,并且让程序结构更清晰。
数组的解构赋值数组的结构赋值:将数组中的值按照位置提取出来,然后赋值给变量。
语法在 ES6 之前,当我们在为一组变量赋值时,一般是这样写:
var a = 1;var b = 2;var c = 3;
或者是这样写:
var arr = [1, 2, 3];var a = arr[0];var b = arr[1];var c = arr[2];
现在有了 ES6 之后,我们可以通过数组解构的方式进行赋值:(根据位置进行一一对应)
let [a, b, c] = [1, 2, 3];
二者的效果是一样的,但明显后者的代码更简洁优雅。
未匹配到的情况数据的结构赋值,是根据位置进行一一对应来赋值的。可如果左边的数量大于右边的数量时(也就是变量的数量大于值的数量时),多余的变量要怎么处理呢 ...
05-Promise入门详解
title: 05-Promise入门详解publish: true
为什么需要 Promise?我们在前面的文章《JavaScript 基础:异步编程和 Ajax/单线程和异步》中讲过,Javascript 是⼀⻔单线程语⾔。早期我们解决异步场景时,⼤部分情况都是通过回调函数来进⾏。
(如果你还不了解单线程和异步的概念,可以先去回顾上一篇文章。)
回调的定义把函数 A 传给另一个函数 B 调用,那么函数 A 就是回调函数。
例如在浏览器中发送 ajax 请求,就是常⻅的⼀个异步场景,发送请求后,需要等待一段时间,等服务端响应之后我们才能拿到结果。如果我们希望在异步结束之后执⾏某个操作,就只能通过回调函数这样的⽅式进⾏操作。
var dynamicFunc = function (callback) { setTimeout(function () { callback(); }, 1000);};dynamicFunc(function () { console.log('qian gu& ...
05-call、apply、bind的区别
title: 05-call、apply、bind的区别publish: true
call()和apply()介绍这两个方法都是函数对象的方法,需要通过函数对象来调用。
当函数调用call()和apply()时,函数都会立即执行。
都可以用来改变函数的this对象的指向。
第一个参数都是this要指向的对象(函数执行时,this将指向这个对象),后续参数用来传实参。
显式绑定thisJS提供的绝大多数函数以及我们自己创建的所有函数,都可以使用call 和apply方法。
它们的第一个参数是一个对象。因为你可以直接指定 this 绑定的对象,因此我们称之为显式绑定。
例1:
function foo() { console.log(this.a);}var obj = { a: 2};// 将 this 指向 objfoo.apply(obj); //打印结果:2
第一个参数的传递1、thisObj不传或者为null、undefined时,函数中的this会指向window对象(非严格模式)。
2、传递一个别的函数名时, ...
05-基本数据类型:Number
title: 05-基本数据类型:Numberpublish: true
数值型:Number在JS中所有的数值都是 Number 类型,包括整数和浮点数(小数)。
var a = 100; // 定义一个变量 a,并且赋值整数100console.log(typeof a); // 输出变量 a 的类型var b = 12.3; // 定义一个变量 b,并且赋值浮点数 12.3console.log(typeof a);
上方代码的输出结果为:
numbernumber
再次补充:在 JS 中,只要是数,就是 Number 数值型的。无论整浮、浮点数(即小数)、无论大小、无论正负,都是 Number 类型的。
数值范围由于内存的限制,ECMAScript 并不能保存世界上所有的数值。
最大值:Number.MAX_VALUE,这个值为: 1.7976931348623157e+308
最小值:Number.MIN_VALUE,这个值为: 5e-324
如果使用 Number 表示的变量超过了最大值,则会返回Infinity。
无穷大(正无穷):Infinity
无 ...
06-ES6:箭头函数
title: 06-ES6:箭头函数publish: true
前言ES6 在函数扩展方面,新增了很多特性。例如:
箭头函数
参数默认值
参数结构赋值
剩余参数
扩展运算符
this 绑定
尾调用
今天这篇文章,我们讲一下箭头函数。
箭头函数定义箭头函数的语法语法:
(参数1, 参数2 ...) => { 函数体 }
解释:
如果有且仅有 1 个形参,则()可以省略
如果函数体内有且仅有 1 条语句,则{}可以省略,但前提是,这条语句必须是 return 语句。
需要强调的是,箭头函数是没有函数名的,既然如此,那要怎么调用箭头函数呢?你可以将箭头函数赋值给一个变量,通过变量名调用函数;也可以直接使用箭头函数。我们来看看下面的例子。
举例写法 1、定义和调用函数:(传统写法)
function fn1(a, b) { console.log('haha'); return a + b;}console.log(fn1(1, 2) ...
06-Promise的一些题目
title: 06-Promise的一些题目publish: true
Promise 的执行顺序题目 1代码举例:
const p = new Promise((resolve, reject) => { console.log(1);});console.log(2);
打印结果:
12
我们需要注意的是:Promise 里的代码整体,其实是同步任务,会立即执行。
补充:上面的代码中,如果继续写p.then(),那么 then()里面是不会执行的。因为在定义 promise 的时候需要写 resolve,调用 promise 的时候才会执行 then()。
基于此,我们再来看下面这段代码:
const p = new Promise((resolve, reject) => { console.log(1); resolve();});console.log(2);p.then((res) => { console.log(3);});
打印结果:
123
题目 2代码 ...