目录
戳我->原文地址 加老哥进每日打卡群加我也行 每日老哥稳定更新
用js写一个随机生成指定字符串
function randomStringOne(n){
const str='dkladsd9382909183kdls';
let res='';
for(let i=0;i<n;i++){
res+=str.charAt(Math.round(Math.random() * str.length));
}
return res;
}
var str1=randomStringOne(3);
console.log(str1)
function randomStringTwo(n){
const str='asdplsakdjfjdfkjkjsdposjp12321';
const arr=Array.from({length : n },()=>str.charAt(Math.round(Math.random() * str.length)))
return arr.join('');
}
var str2=randomStringTwo(4);
console.log(str2)
用标签实现一个三角形
//html
<div class="Triangle">
<span class="border-triangle"></span>
<!-- 方法二 -->
<div class="message-box">
<span>我是利用 css transfrom 实现的</span>
<div class="triangle-css3 transform ie-transform-filter"></div>
</div>
<!-- 方法三 -->
<div class="box"></div>
</div>
//css
.border-triangle{
border: 30px solid transparent;
border-bottom: 30px teal solid;
display: block;
width: 0;
margin-bottom: 50px;
}
/* 实现三角形方法二 */
.message-box {
position:relative;
width:240px;
height:60px;
line-height:60px;
background:#E9FBE4;
box-shadow:1px 2px 3px #E9FBE4;
border:1px solid #C9E9C0;
border-radius:4px;
text-align:center;
color:#0C7823;
}
.triangle-css3 {
position:absolute;
bottom:-8px;
bottom:-6px;
left:30px;
overflow:hidden;
width:13px;
height:13px;
background:#E9FBE4;
border-bottom:1px solid #C9E9C0;
border-right:1px solid #C9E9C0;
}
.transform {
-webkit-transform:rotate(45deg);
-moz-transform:rotate(45deg);
-o-transform:rotate(45deg);
transform:rotate(45deg);
}
/*ie7-9*/
.ie-transform-filter {
-ms-filter: progid:DXImageTransform.Microsoft.Matrix(
M11=0.7071067811865475,
M12=-0.7071067811865477,
M21=0.7071067811865477,
M22=0.7071067811865475,
SizingMethod='auto expand');
filter: progid:DXImageTransform.Microsoft.Matrix(
M11=0.7071067811865475,
M12=-0.7071067811865477,
M21=0.7071067811865477,
M22=0.7071067811865475,
SizingMethod='auto expand');
}
/* 方法三 */
.box{
width: 30px;
height: 30px;
margin-top: 100px;
-webkit-background: linear-gradient(45deg, transparent 50%, red 50%, red 100%);
background: linear-gradient(45deg, transparent 50%, red 50%, red 100%);
}

数组去重
/**
*数组去重
*/
let testArr=[2,3,42,3,5,2,1,52,42,64,52];
//for
function distinctFor(arr=testArr){
let result = [] , len= arr && arr.length;
for(let i = 0; i < len ; i++){
for(let j=i+1; j<len;j++){
if(arr[i]==arr[j]){
j=++i;
}
}
result.push(arr[i])
}
return result;
}
// forEach indexOf
function distinctForEachIndexOf(arr=testArr){
let result=[];
arr.forEach((v,i,array)=>{
array.indexOf(v,i+1)===-1 && result.push(v)
});
return result;
}
// filter 去重
function distinctFilter(arr=testArr){
return arr.filter((v,i,array)=>array.indexOf(v,i+1) < 0);
}
distinctFilter();//[3, 5, 2, 1, 42, 64, 52]
distinctFor(); //[3, 5, 2, 1, 42, 64, 52]
distinctForEachIndexOf();//[3, 5, 2, 1, 42, 64, 52]
var newArr=Array.from(new Set(testArr)); // set 去重
console.log(newArr);//[2, 3, 42, 5, 1, 52, 64]
-
forEach
语法:
arr.forEach(callback(currentValue [, index [, array]])[, thisArg]);参数:callback为数组中每个元素执行的函数,该函数接收三个参数:currentValue数组中正在处理的当前元素。index可选 数组中正在处理的当前元素的索引。array可选forEach()方法正在操作的数组。thisArg可选 可选参数。当执行回调函数callback时,用作this的值。 返回值undefined。示例:const arraySparse = [1,3,,7]; let numCallbackRuns = 0; arraySparse.forEach(function(element){ console.log(element); numCallbackRuns++; }); console.log("numCallbackRuns: ", numCallbackRuns);// ,, 会被跳过 // 1 // 3 // 7 // numCallbackRuns: 3 -
filter
语法:
var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])参数:
callback用来测试数组的每个元素的函数。返回 true 表示该元素通过测试,保留该元素,false 则不保留。它接受以下三个参数:element数组中当前正在处理的元素。index可选 正在处理的元素在数组中的索引。array可选 调用了 filter 的数组本身。thisArg可选 执行callback时,用于 this 的值。filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回 true 或等价于 true 的值的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback 测试的元素会被跳过,不会被包含在新数组中。
深拷贝 浅拷贝
浅拷贝只复制指向某个对象的指针,而不复制对象本身, 新旧对象还是共享同一块内存。但深拷贝会另外创造一 个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
- 深拷贝
/**
*------------------------------------------------
* 深拷贝 && 浅拷贝
* 浅拷贝只复制指向某个对象的指针,而不复制对象本身,
新旧对象还是共享同一块内存。但深拷贝会另外创造一
个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
*------------------------------------------------
**/
/*
*深拷贝
*JSON api
*缺点:
*不能复制 function 、正则、Symbol
*循环引用报错
*相同引用重复复制
*/
var testObj=[
{
txt1:"测试文本",
id:"1",
content:"我是长文本啊啊啊啊"
},
{
txt1:"测试文本2",
id:"2",
content:"我是长文本啊啊啊啊2"
}
]
// var testObj=['txt1','txt2','txt3','txt4']
JSON.parse(JSON.stringify(testObj));
/*
* 深拷贝
*
*/
function copy(obj){
let newobj = null; //声明一个变量用来储存拷贝之后的内容
//判断数据类型是否是复杂类型,如果是则调用自己,再次循环,如果不是,直接赋值即可,
//由于null不可以循环但类型又是object,所以这个需要对null进行判断
if(typeof(obj) == 'object' && obj !== null){
//声明一个变量用以储存拷贝出来的值,根据参数的具体数据类型声明不同的类型来储存
newobj = obj instanceof Array? [] : {}; //instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链
//循环obj 中的每一项,如果里面还有复杂数据类型,则直接利用递归再次调用copy函数
for(var i in obj){
newobj[i] = copy(obj[i])
}
}else{
newobj = obj
}
return newobj; //函数必须有返回值,否则结构为undefined
}
var copyTest = copy(testObj)
testObj[0].id="3";
console.log(testObj) // [0].id==3
console.log(copyTest)// [0].id==1
- 浅拷贝
/**
* 浅拷贝
* ***/
Object.assign(testObj);
// 浅拷贝
function shallowCopy(src) {
var dst = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}
// 浅拷贝修改第一层数据及 包含子对象的数据 呆萌 //
var obj1 = {
'name' : 'zhangsan',
'age' : '18',
'language' :{
names:"原始数据"
},
};
var obj3 = shallowCopy(obj1);
obj3.name = "lisi";
obj3.language.names = '测试修改';
console.log('obj1',obj1) // ... name:'zhangsan',language:'测试修改'
console.log('obj3',obj3) // ... name:'lisi',language:'测试修改'
-
赋值、深拷贝、浅拷贝对原始数据影响-
赋值:
和原数据指向同一对象,修改赋的值原始数据也会一同改变(不管对象中是否包含子对象) -
浅拷贝:
和原数据不指向同一对象,如果第一层为基本数据类型修改后原始数据不会一同改变,如果修改第一层中含子对象的元素,会改变相应原始数据里的值。(如上面的浅拷贝 ) -
深拷贝:
和原数据不指向同一对象,不管修改那个子元素都不会影响原始数据
-
未完待续 -_-#