[TOC]
### 1. js中使用typeof 能得到哪些数据类型
~~~
1. typeof是用来查看数据的所属类型。
2. 能够区分基本数据类型和引用数据类型,
3. 总共得到6种数据类型。其中包括4种基本数据类型(number,string,boolean,undefined)和2种引用数据类型(Object, Function)
~~~
### 2. js内置函数有哪些
~~~
1. 内置函数是数据封装类对象。里面封装有属性和方法供其他类(函数)继承
2. 有11种
Number,String,Boolean,Math,Object, Function,Array,Date,Error,Ergexp(正则)
~~~
### 3. ==和===的区别
~~~
1. ==
1.值比较,不用考虑左右两边类型,比较时要进行类型转换(转换方式如下)
2.倘若有一边的值为boolean,那么先将boolean-->number再比较
3.倘若一边为字符串,一边为number,那么string-->number再比较
4.null==undefined
5.NaN与任何值计算,结果都为NaN 除非 NaN!=NaN-->true
6.null和undefined比较之前不能将其转为其它类型
2. ===
1.安全等,左右两边的的值和类型完全相同才返回true
2.比较时不需要转换类型直接进行比较
~~~
### 4. js中this的指向
~~~
javascrip的顶级作用域是window,全局变量是window的属性,函数是window的方法;
this的指向:
1.在事件中,this指向正在执行事情的当前对象
2.在方法中,谁调用方法,this指向谁
this作为普通函数调用时指向window
例1:
var a=10;
//window.a=10;
function b(){
console.log(this.a);
}
//window.b();
b();
console.log(window.a);
例2:
<input type="text" value="hello" id="test">
<script>
var value = "change"
var test = document.getElementById("test");
test.onclick = function () {
go();
//在事件中,this指向正在执行事情的当前对象
console.log(this.value);//hello
}
//因函数是window的方法,故调用它的肯定是window中的value
function go() {
console.log(value);//change
}
</script>
~~~
### 5. 原生ajax
~~~
1.创建ajax核心对象
2.与服务器建立连接
3.向服务器发送请求
4.服务器响应
~~~
示例:
~~~
<script>
var url= "https://www.easy-mock.com/mock/5bad81fca1b7f6239a61664d/dataTest/pcTest";
var xhr = new XMLHttpRequest();
xhr.open("get",url);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
var reponse = xhr.responseText;
console.log(reponse);
// JSON.parse 可以将字符串转为JSON对象
var name = JSON.parse(reponse).data.name;
console.log(name);
}
}
</script>
~~~
### 6. jquery-ajax
1.$.ajax()
~~~
window.onload = function(){
$.ajax({
type:"get",
url:"xx",
dataType:"json",
success:function(res){
console.log(res);
},
error:function(xhr){
document.body.innerHTML = xhr.status;
}
})
~~~
2.$.get()
~~~
//$.get()语法
$.get(url,function(data,status){
//获取的data是一个JS对象
}).fail(function(data){
console.log(data.status)
})
//取到的数据已json的方式打开
//$.get()语法
$.get(url,function(data,status){
//获取的data是一个JS对象
},"jsonp").fail(function(data){
console.log(data.status)
},"jsonp")
~~~
3.$.post()
~~~
//$.post()语法
$.post(url,data,function(data,status){
}).fail(function(data){
console.log(data.status)
})
~~~
### 7. axios
~~~
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
~~~
1.get
~~~
//通过给定的ID来发送请求
axios.get(url).then(function (response) {
}).catch(function (err) {
console.log(err);
});
~~~
2.post
~~~
//post
axios.post(url, {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (res) {
console.log(res);
})
.catch(function (err) {
console.log(err);
});
~~~
### 8. 原型和原型链
原型:
~~~
原型是一个对象,原型中封装一些方法和属性可供其他对象继承。
原型对象-->Prototype (可被继承的类 和构造函数才有 对象中没有)
__proto__(双下划线属性)(除了根父类object中没有 其他的都有)
~~~
原型链:
~~~
js中每一个引用数据类型都有__proto__(双下划线属性),且指向它的原型对象Prototype,同时共享原型上的方法
所有的对象中都有一个双下划线属性 而双下划线属性指向上一级的原型对象 而上一级原型对象又指向根父类object通过一个__proto__来链接起来形成链
~~~
### 9. 正则
正则概念:
~~~
规定字符串出现规则的表达式
实现获取字符串中所有相同元素
~~~
正则使用方法
~~~
1. 正则使用/正则内容/
2. 在后面加g 表示全局搜索(在整个使用了正则表达式的字符串中进行搜索)
3. 在后面加i 表示全局搜索且 忽略大小写
~~~
[正则的其他内容](https://www.kancloud.cn/tjs5945111/javascrip/778219)
### 10.promise
[参考笔记](https://www.kancloud.cn/tjs5945111/wxxcx/823757)
### 11. js的DOM操作
[DOM操作](https://www.kancloud.cn/tjs5945111/javascrip/759035)
### 12. js数组
[参看笔记](https://www.kancloud.cn/tjs5945111/javascrip/768562)
### 13. 操作字符串的方法
~~~
1. length-->获取字符串的长度
2. concat-->增加的方法
3. charAt(index);-->查询指定下标的值
4. indexOf;
5. lastIndexOf(value))--> 从后开始查找.
6. slice
7. subString(startIndex,endIndex)
8. split(separator)-->将字符串按指定格式分割成数组
9. search(value)-->返回搜索值的下标
10. match(value)-->被搜索到的值返回一个数组
11. replace() -->替换
~~~
### 14. Ajax请求总共有八种Callback
~~~
onSuccess
onFailure
onUninitialized 初始化前
onLoading
onLoaded
onInteractive 数据交互
onComplete 完整的
onException 例外
~~~
### 15. 字符串与数组之间的转换
1\. 数组转字符串
~~~
使用join(/)函数
~~~
2\. 字符串转数组
~~~
1.split()
var a ="adskflhsdkfh/asdjfh"
console.log(a.split("/"))
~~~
3\. 将对象转为数组
~~~
var arr =[
{name:"zhang"},
{name:"zhan"},
{name:"zha"},
]
1. 方法1
var ar =[];
arr.forEach(ele=>{
ar.push(ele.name)
})
var newarr=ar.join("/");
console.log(newarr);
~~~
### 16.**判断一个对象是否为数组:**
> 问题来源于,typeof {}和typeof \[\]的结果都是object;
> 怎么通过typeof去判断一个对象是不是数组类型呢?对象是对象,数组也是对象,**js中万物皆对象**
* **1、从原型入手,Array.prototype.isPrototypeOf(obj);**
利用isPrototypeOf()方法,判定Array是不是在obj的原型链中,如果是,则返回true,否则false。
* **2、从构造函数入手,obj instanceof Array**
instanceof只会返回一个布尔值
~~~
[] instanceof Array ==> true
~~~
* **3、根据对象的class属性(类属性),跨原型链调用toString()方法。**
Object.prototype.toString.call(obj);
~~~
Object.prototype.toString.call([]);
==> "[object Array]"
~~~
* **4、Array.isArray()方法。**
~~~
rray.isArray([1, 2, 3]); // true
Array.isArray({foo: 123}); // false
~~~
### 17. 谈谈你对sass理解
~~~
1. sass是css预处理器
2. sass是基于ruby开发的
3. 能够使用嵌套语法使用变量和代码块 减少重复代码并能实现代码复用
~~~
### 18. call、apply、bind的区别
~~~
call、apply、bind用来改变this指向。
bind调用后不会直接执行,会改变函数的执行顺序
call和apply是直接执行
~~~
### 19.call 和 apply
1. call\-->改变函数内部this,关键字的指向call(thisObj,params)
~~~
var cheng={
name:"cheng"
}
var jiang = {
name:"jiang",
sayName(a,b){
console.log(this.name);
console.log(a+b);
}
}
jiang.sayName.call(cheng,1,2);
~~~
2. apply-->改变函数内部this关键字的指向 apply(thisObj,\[params\])
~~~
var cheng={
name:"cheng"
}
var jiang = {
name:"jiang",
sayName(a,b){
console.log(this.name);
console.log(a+b);
}
}
jiang.sayName.apply(cheng,[1,2])
~~~
3. call\-->改变函数内部this,关键字的指向call(thisObj,params)
### 20. 使用`解构语法`实现 引用数据类型 的赋值
~~~
//对象
var a={
name:'tong',
age:18
}
var b={...a}
b.name='li'
console.log(a.name) ; //tong
//数组
var a = [1, 2, 3, 4, 5]
var b = [...a]
b[0] = 66
console.log(a); //[1, 2, 3, 4, 5]
~~~
### 21. 深浅拷贝
~~~
1. 浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,
2. 深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
~~~
### 22.js 判断是自有属性 还是共有属性
~~~
1、判断自有属性
var boolean = obj.hasOwnProperty("属性名");//返回布尔值
2、判断共有属性
var bool = ! obj.hasOwnProperty("属性名") && obj.属性名!==undefined;
~~~