js 复制/转换 window对象的全部属性内容 为字符串

Posted hhdom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 复制/转换 window对象的全部属性内容 为字符串相关的知识,希望对你有一定的参考价值。

控制台copy(window)不行,只得到[object Window]

copy(object) copies a string representation至于具体是怎么实现的嘛,猜测类似于.toString() of the specified object to the clipboard.(参考https://developer.chrome.com/docs/devtools/console/utilities/#copy-function)

 

copy(JSON.stringify(window))也不行,报错Uncaught TypeError: Converting circular structure to JSON

需要定义一个处理循环结构的函数,可以参考https://stackoverflow.com/questions/11616630/how-can-i-print-a-circular-structure-in-a-json-like-format

我是用的这个

const circularReference = otherData: 123;
circularReference.myself = circularReference;

const getCircularReplacer = () => 
  const seen = new WeakSet();
  return (key, value) => 
    if (typeof value === "object" && value !== null) 
      if (seen.has(value)) 
        return;
      
      seen.add(value);
    
    return value;
  ;
;

const stringified = JSON.stringify(circularReference, getCircularReplacer());

console.log(stringified);


不过复制出来有一些长的转义格式化有问题

JS基础 对象

阅读目录

基础知识

对象是包括属性与方法的数据类型,
JS中大部分类型都是对象如 String/Number/Math/RegExp/Date 等等。

传统的函数编程会有错中复杂的依赖很容易创造意大利式面条代码。

面向过程编程

let name = "wgchen";

let grade = [
   lesson: "js", score: 99 ,
   lesson: "mysql", score: 85 
];

function average(grade, name) 
  const total = grade.reduce((t, a) => t + a.score, 0);
  return name + ":" + total / grade.length + "分";


console.log(average(grade, name)); // wgchen:92分

面向对象编程

下面使用对象编程的代码结构清晰,也减少了函数的参数传递,也不用担心函数名的覆盖

let user = 
  name: "wgchen",
  grade: [
     lesson: "js", score: 99 ,
     lesson: "mysql", score: 85 
  ],
  average() 
    const total = this.grade.reduce((t, a) => t + a.score, 0);
    return this.name + ":" + total / this.grade.length + "分";
  
;

console.log(user.average()); // wgchen:92分

OOP

  • 对象是属性和方法的集合即封装
  • 将复杂功能隐藏在内部,只开放给外部少量方法,更改对象内部的复杂逻辑不会对外部调用造成影响即抽象。
  • 继承是通过代码复用减少冗余代码
  • 根据不同形态的对象产生不同结果即多态

基本声明

使用字面量形式声明对象是最简单的方式

let obj = 
  name: 'wgchen',
  get:function() 
  	return this.name;
  

console.log(obj.get()); // wgchen

属性与方法简写

let name = "wgchen";
let obj = 
  name,
  get() 
    return this.name;
  
;
console.log(obj.get()); // wgchen

其实字面量形式在系统内部也是使用构造函数 new Object 创建的,后面会详细介绍构造函数。

let hd = ;
let wgchen = new Object();

console.log(hd, wgchen);
console.log(hd.constructor);
console.log(wgchen.constructor);

操作属性 *

使用点语法获取

let user = 
  name: "wgchen"
;

console.log(user.name); // wgchen

使用 [] 获取

console.log(user["name"]);

可以看出使用 . 操作属性更简洁,[] 主要用于通过变量定义属性的场景。

let user = 
  name: "wgchen"
;
let property = "name";
console.log(user[property]); // wgchen

如果属性名不是合法变量名就必须使用扩号的形式了

let user = ;
user["my-age"] = 28;
console.log(user["my-age"]); // 28

对象和方法的属性可以动态的添加或删除。

const hd = 
  name: "wgchen"
;

hd.age = "10";
hd.show = function() 
  return `$this.name已经$this.age岁了`;
;

console.log(hd.show());
console.log(hd);

delete hd.show;
delete hd.age;

console.log(hd);
console.log(hd.age); //undefined

对象方法

定义在对象中的函数我们称为方法,下面定义了学生对象,并提供了计算平均成绩的方法

let lisi = 
  name: "李四",
  age: 22,
  //等级
  grade: 
    math: 99,
    english: 67
  ,
  //平均成绩
  avgGrade: function() 
    let total = 0;
    for (const key in this.grade) 
      total += this.grade[key];
    
    return total / this.propertyCount("grade");
  ,
  //获取属性数量
  propertyCount: function(property) 
    let count = 0;
    for (const key in this[property]) count++;
    return count;
  
;

console.log(lisi.avgGrade()); // 83

一个学生需要手动创建一个对象,这显然不实际的,下面的构造函数就可以解决这个问题

引用特性

对象和函数、数组一样是引用类型,即复制只会复制引用地址。

let hd =  name: "wgchen" ;
let cms = hd;
cms.name = "blog";

console.log(hd.name); //blog

对象做为函数参数使用时也不会产生完全赋值,内外共用一个对象

let user =  age: 22 ;

function hd(user) 
  user.age += 10;


hd(user);

console.log(user.age); //32

对多的比较,是对内存地址的比较,所以使用 == 或 === 一样。

let hd = ;
let xj = hd;
let cms = ;
console.log(hd == xj); //true
console.log(hd === xj); //true
console.log(hd === cms); //false

this

this 指当前对象的引用,始终建议在代码内部使用 this 而不要使用对象名,不同对象的 this只指向当前对象。

下例是不使用 this 时发生的错误场景

  • 删除了xj 变量,但在函数体内还在使用 xj 变量造成错误
  • 使用 this 后始终指向到引用地址,就不会有这个问题
let xj = 
  name: "wgchen",
  show() 
    return xj.name;
  
;
let hd = xj;
xj = null;
console.log(hd.show()); // Uncaught TypeError: Cannot read properties of null (reading 'name')

改用 this 后一切正常

let xj = 
  name: "wgchen",
  show() 
    return this.name;
  
;
let hd = xj;
xj = null;
console.log(hd.show()); // wgchen

展开语法

使用 ... 可以展示对象的结构,下面是实现对象合并的示例

let hd =  name: "wgchen", web: "blog" ;
let info =  ...hd, site: "cms" ;
console.log(info); // name: 'wgchen', web: 'blog', site: 'cms'

下面是函数参数合并的示例

function upload(params) 
  let config = 
    type: "*.jpeg,*.png",
    size: 10000
  ;
  params =  ...config, ...params ;
  console.log(params); // type: '*.jpeg,*.png', size: 999


upload( size: 999 ); 

对象转换

基础知识

对象直接参与计算时,系统会根据计算的场景在 string/number/default 间转换。

  • 如果声明需要字符串类型,调用顺序为 toString > valueOf
  • 如果场景需要数值类型,调用顺序为 valueOf > toString
  • 声明不确定时使用 default ,大部分对象的 default 会当数值使用

下面的数值对象会在数学运算时转换为 number

let wgchen = new Number(1);
console.log(wgchen + 3); //4

如果参数是字符串时会转换为 string

let wgchen = new Number(1);
console.log(wgchen + "3"); //13

下面当不确定转换声明时使用 default ,大部分 default 转换使用 number 转换。

let wgchen = new Number(1);
console.log(wgchen == "1"); //true

内部自定义 Symbol.toPrimitive 方法用来处理所有的转换场景

let hd = 
  num: 1,
  [Symbol.toPrimitive]: function() 
    return this.num;
  
;

console.log(hd + 3); //4

Symbol.toPrimitive 是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。

const object1 = 
  [Symbol.toPrimitive](hint) 
    if (hint === 'number') 
      return 42;
    
    return null;
  
;

console.log(+object1); // expected output: 42

自定义valueOf 与 toString 方法用来转换,并不限制返回类型

let hd = 
  name: "wgchen",
  num: 1,
  valueOf: function() 
    console.log("valueOf");
    return this.num;
  ,
  toString: function() 
    console.log("toString");
    return this.name;
  
;

console.log(hd + 3); //valueOf 4
console.log(`$hd blog`); //toString

解构赋值

解构是一种更简洁的赋值特性,可以理解为分解一个数据的结构,在数组章节已经介绍过。

建议使用 var/let/const 声明

基本使用 *

下面是基本使用语法

//对象使用
let info = name:'wgchen',url:'https://wgchen.blog.csdn.net';
let name:n,url:u = info
console.log(n); // wgchen

//如果属性名与变量相同可以省略属性定义
let name,url = name:'wgchen',url:'https://wgchen.blog.csdn.net';
console.log(name); // wgchen

函数返回值直接解构到变量

function hd() 
  return 
    name: 'wgchen',
    url: 'blog'
  ;

let name: n,url: u = hd();
console.log(n); // wgchen

函数传参

"use strict";

function hd( name, age ) 
  console.log(name, age); //wgchen 18


hd( name: "wgchen", age: 18 );

系统函数解构练习,这没有什么意义只是加深解构印象

const random =Math;
console.log(random());

严格模式

非严格模式可以不使用声明指令,严格模式下必须使用声明。
所以建议使用 let 等声明。

// "use strict";
(name,url = name:'wgchen',url:'blog');
console.log(name, url); // wgchen blog

还是建议使用 let 等赋值声明

"use strict";
let  name, url  =  name: "wgchen", url: "blog" ;
console.log(name, url); // wgchen blog

简洁定义

如果属性名与赋值的变量名相同可以更简洁

let web =  name: "wgchen",url: "blog" ;
let  name, url  = web;
console.log(name); // wgchen

只赋值部分变量

let [,url]=['wgchen','blog'];
console.log(url); // blog

let name= name:'wgchen',url:'blog';
console.log(name); // wgchen

可以直接使用变量赋值对象属性

let name = "name",url = "blog";

//标准写法如下
let hd =  name: name, url: url ;
console.log(hd);  // name: 'name', url: 'blog'

//如果属性和值变量同名可以写成以下简写形式
let opt =  name, url ;
console.log(opt); // name: 'name', url: 'blog'

嵌套解构 *

可以操作多层复杂数据结构

const hd = 
  name:'wgchen',
  lessons:
    title:'JS'
  


const name,lessons:title  = hd;
console.log(name,title); //wgchen JS

为变量设置默认值 *

let [name, site = 'blog'] = ['wgchen'];
console.log(site); //blog
let name,url,user='ycc' = name:'willem',url:'csdn';
console.log(name,user); // willem ycc

使用默认值特性可以方便的对参数预设

function createElement(options) 
  let 
    width = '200px',
    height = '100px',
    backgroundColor = 'red'
   = options;
  
  const h2 = document.createElement('h2');
  
  h2.style.width = width;
  h2.style.height = height;
  h2.style.backgroundColor = backgroundColor;

  document.body.appendChild(h2);


createEleme

以上是关于js 复制/转换 window对象的全部属性内容 为字符串的主要内容,如果未能解决你的问题,请参考以下文章

JS中实现深度拷贝,复制一个对象

javascript 是如何体现继承的

JS基础

JS基础 对象

更改数组中对象的属性

JS打印对象的方法&将Object转换为String的函数