JavaScript高频手写面试题,看看你更会吗

临安娱乐新闻网 2025-11-09

son instanceof Person) // true建模instanceof

instanceof 用作验证构造线性的prototype前提在最简单的在此之后双链上,需注意的是instanceof不用用来验证引用统计数据特性,对于基本统计数据验证都不会回到false

理论

通过反应器验证最简单的紧接proto紧接本体前提与构造线性的prototype本体相等

文档化解解决办法/** * instanceof 用作验证构造线性的prototype前提在最简单的在此之后双链上 */function myInstanceof(left, right) { // 先行除去基本统计数据特性 if(typeof left !== 'object' || left === null) return false let proto = left.紧接proto紧接 while(proto) { if(proto === right.prototype) return true proto = proto.紧接proto紧接 } return false}function Person() {}let person = new Person()console.log(myInstanceof(person,Person)) // true建模Function.prototype.apply()

apply() 原理线程一个较强给定this绝对值的线性,以及以一个codice_(或类codice_某类)的形式缺少的给定。

Function.prototype.myApply = function(context) { var context = context || window // 给予需客户端的this context.fn = this // 给予需偏离this的线性 const arg = arguments[1] // 给予发送到到给线性的给定 if(!(arg instanceof Array)) { throw Error('给定需是一个codice_') } const res = context.fn(...arg) // 指派线性 delete context.fn // 撤下该原理 return res // 回到线性回到绝对值}function say(a,b,c) { console.log(this.name,a,b,c)}say.myApply({name:'nanjiu'},[1,2,3]) //nanjiu 1 2 3say.apply({name:'nanjiu'},[1,2,3]) //nanjiu 1 2 3建模Function.prototype.call()

call() 原理领域于一个均须的 this 绝对值和原则上给出的一个或多个给定来线程一个线性。

Function.prototype.myCall = function(context) { var context = context || window // 给予需偏离的this context.fn = this // 给予需偏离this的线性 const args = [...arguments].slice(1) // 给予给定一览表 const res = context.fn(...args) // 将给定留给线性并指派 delete context.fn // 撤下该原理 return res // 回到线性回到绝对值}function say(a,b,c) { console.log(this.name,a,b,c)}say.myCall({name:'nanjiu'},1,2,3) //nanjiu 1 2 3say.call({name:'nanjiu'},1,2,3) //nanjiu 1 2 3建模Function.prototype.bind()

bind() 原理创建者一个新近的线性,在 bind() 被线程时,这个新近线性的 this 被均须为 bind() 的第一个给定,而其余给定将作为新近线性的给定,供线程时领域于。

Function.prototype.myBind = function(context) { var context = context || window //给予需偏离的this context.fn = this // 给予需偏离this的线性 //给予线性给定 const args = [...arguments].slice(1) // 与apply,call不同的是这里需回到一个线性 return () => { return context.fn.apply(context,[...args]) }}function say(a,b,c) { console.log(this.name,a,b,c)}say.bind({name: 'nanjiu'},1,2,3)() //nanjiu 1 2 3say.myBind({name: 'nanjiu'},1,2,3)() //nanjiu 1 2 3建模Array.prototype.forEach()

forEach() 原理对codice_的每个类型指派一次给定的线性,无回到绝对值。

构词arr.forEach(callback(currentValue [, index [, array]])[, thisArg])给定callback为codice_中所每个类型指派的线性,该线性接收一至三个给定:currentValuecodice_中所正在妥善处理的现阶段类型。index 预选项codice_中所正在妥善处理的现阶段类型的引文。array 预选项forEach() 原理正在加载的codice_。thisArg 预选项预选项给定。当指派回退线性 callback 时,用作 this 的绝对值。文档化解解决办法Array.prototype.myForEach = function(callback, context) { const arr = this // 给予线程的codice_ const len = arr.length || 0 let index = 0 // codice_下标 while(index < len) { callback.call(context ,arr[index], index) index++ }}let arr = [1,2,3]arr.forEach((item,index) => { console.log(----key: ${index} - item: ${item}----)})console.log('----------')arr.myForEach((item,index) => { console.log(----key: ${index} - item: ${item}----)})/** * key: 0 - item: 1key: 1 - item: 2key: 2 - item: 3----------key: 0 - item: 1key: 1 - item: 2key: 2 - item: 3 */建模Array.prototype.map()

map() 原理创建者一个新近codice_,其结果是该codice_中所的每个类型是线程一次缺少的线性后的回到绝对值。

构词var new_array = arr.map(function callback(currentValue[, index[, array]]) { // Return element for new_array }[, thisArg])给定

callback

生成新近codice_类型的线性,领域于三个给定:

currentValuecodice_中所正在妥善处理的现阶段类型。index预选项codice_中所正在妥善处理的现阶段类型的引文。array预选项map 原理线程的codice_。

thisArg预选项

指派 callback 线性时绝对值被用作this。

文档化解解决办法/** * map() 原理创建者一个新近codice_,其结果是该codice_中所的每个类型是线程一次缺少的线性后的回到绝对值。 */Array.prototype.myMap = function(callback, context) { const arr = this,res = [] const len = arr.length || 0 let index = 0 while(index < len) { res.push(callback.call(context, arr[index], index)) index ++ } return res // 与forEach不同的是map有回到绝对值}const arr = [1,2,3]let res1 = arr.map((item,index) => { return ----k:${index}-v:${item}----})let res2 = arr.myMap((item,index) => { return ----k:${index}-v:${item}----})console.log(res1) // [ 'k:0-v:1', 'k:1-v:2', 'k:2-v:3' ]console.log(res2) // [ 'k:0-v:1', 'k:1-v:2', 'k:2-v:3' ]建模Array.prototype.Filter()

filter() 原理创建者一个新近codice_, 其相关联通过所缺少线性化解解决办法的测试者的所有类型。

构词var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])给定

callback

用来测试者codice_的每个类型的线性。回到 true 表示该类型通过测试者,保持一致该类型,false 则不保持一致。它接受以下三个给定:

elementcodice_中所现阶段正在妥善处理的类型。index预选项正在妥善处理的类型在codice_中所的引文。array预选项线程了 filter 的codice_本身。

thisArg预选项

指派 callback 时,用作 this 的绝对值。

文档化解解决办法/** * ----filter()---- 原理创建者一个新近codice_, 其相关联通过所缺少线性化解解决办法的测试者的所有类型。 */Array.prototype.myFilter = function(callback, context) { const arr = this,res = [] const len = arr.length let index = 0 while(index < len) { if(callback.call(context,arr[index],index)) { res.push(arr[index]) } index ++ } return res}const arr = [1,2,3]let res1 = arr.filter((item,index) => { return item<3})let res2 = arr.myFilter((item,index) => { return item<3})console.log(res1) // [ 1, 2 ]console.log(res2) // [ 1, 2 ]线性柯里化

柯里化,英语:Currying(果然是满满的英译中所的既视感),是把接受多个给定的线性变换成接受一个单一给定(在此之后线性的第一个给定)的线性,并且回到接受只剩的给定而且回到结果的新近线性的高效率。

先行来了解一下什么是线性柯里化,上面文绉绉的内容可能不是那么容易了解,我们还是从外部上文档来了解吧

// 假如有这样一个线性function add (a,b,c) { console.log(a+b+c)}add(1,2,3) //6/** * 我们希望可以通过add(1,2)(3)或add(1)(2)(3)或add(1)(2,3)这样线程也能够得倒正确的计算结果 这就是线性柯里化的简单领域 */文档化解解决办法function curry(fn, curArgs) { const len = fn.length // 需柯里化线性的给定倍数 curArgs = curArgs || [] return function() { let args = [].slice.call(arguments) // 给予给定 args = curArgs.concat(args) //拼接给定 // 基本思想就是当拼接紧接的给定倍数与原线性给定倍数相等才指派这个线性,否则就正则表达式拼接给定 if(args.length < len) { return curry(fn, args) }else{ return fn.apply(this, args) } }}let fn = curry(function(a,b,c){ console.log([a,b,c])})fn(1,2,3) // [ 1, 2, 3 ]fn(1,2)(3) // [ 1, 2, 3 ]fn(1)(2,3) // [ 1, 2, 3 ]fn(1)(2)(3) // [ 1, 2, 3 ]类codice_转codice_

类codice_是较强length本体,但不较强codice_在此之后上的原理。常见的类codice_有arguments、DOM加载原理回到的结果。

function translateArray() { //原理一:Array.from const res1 = Array.from(arguments) console.log(res1 instanceof Array, res1) // true [ 1, 2, 3 ] // 原理二:Array.prototype.slice.call const res2 = Array.prototype.slice.call(arguments) console.log(res2 instanceof Array, res2) // true [ 1, 2, 3 ] // 原理三:concate const res3 = [].concat.apply([],arguments) console.log(res3 instanceof Array, res3) // true [ 1, 2, 3 ] // 原理四:扩展表达式 const res4 = [...arguments] console.log(res4 instanceof Array, res4) // true [ 1, 2, 3 ]}translateArray(1,2,3)化解解决办法极深拷贝

在拷贝的时候推断一下本体绝对值的特性,如果是某类,正则表达式线程极深拷贝线性

/** * 在拷贝的时候推断一下本体绝对值的特性,如果是某类,正则表达式线程极深拷贝线性 */function deepClone(obj, cache=new Map()) { // 基本统计数据特性从外部回到 if(typeof obj !== 'object' || obj === null) return obj // 防止反应器引用 const cacheTarget = cache.get(obj) // 已经存有就从外部回到 if(cacheTarget) return cacheTarget let newObj = obj instanceof Array ? [] : {} // 新近建一个某类 cache.set(obj, newObj) // 遍历原某类 for(let key in obj) { if(obj.hasOwnProperty(key)) { newObj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key] } } return newObj}const obj = { name: '张三'}const obj1 = objconst obj2 = deepClone(obj)console.log(obj1===obj) //trueconsole.log(obj2===obj) //false承袭的化解解决办法在此之后双链承袭

在此之后双链承袭化解解决办法的理论就是将构造线性的在此之后设置为另一个构造线性的最简单某类,这样就可以承袭另一个在此之后某类的所有本体和原理,可以继续往上,再继续次形成在此之后双链。

function Parent1(name, age) { this.name = name, this.age = age}Parent1.prototype.say = function() { console.log(this.name)}function Child1(name) { this.name = name}Child1.prototype = new Parent1()Child1.prototype.constructor = Child1let child1 = new Child1('正直',18)console.log(child1) //Child1 {name: '正直'}child1.say() // 正直

缺陷:

当化解解决办法承袭后,另一个在此之后的最简单本体,变成了现今这个在此之后的在此之后本体,然后该在此之后的引用特性本体不会被所有的最简单交换,这样承袭在此之后引用特性本体的最简单之间以后继续较强自己的独特性了。在创建者子特性的最简单时,没有设法在不影响所有某类最简单的才不会给超强特性的构造线性中所发送到到给定。构造线性承袭

为了化解在此之后中所相关联引用特性绝对值的解决办法,开始领域于改作构造线性,也叫伪造某类或经典承袭

构造线性承袭化解解决办法的理论就是在子类中所线程父类构造线性来化解解决办法承袭

function Parent2(age) { this.age = age this.say = function() { console.log(this.name) }}function Child2(name,age,gender) { this.name = name Parent2.call(this, age) this.gender = gender}let child2 = new Child2('张三', 18, 'boy')console.log(child2) //Child2 {name: '张三', age: 18, gender: 'boy'}child2.say() // 张三

灵活性: 可以发送到到给定以及避免了引用特性的本体被所有最简单交换

缺陷: 所有原理都在构造线性内,每次创建者某类都不会创建者对应的原理,大为浪费缓存

配对承袭*

也叫伪经典承袭,将在此之后双链和改作构造线性的高效率配对到旁边。领域于在此之后双链化解解决办法对在此之后本体和原理的承袭,而通过构造线性来化解解决办法对最简单本体的承袭。

function Parent3(age) { this.age = age}Parent3.prototype.say = function() { console.log(this.name)}function Child3(name,age,gender) { this.name = name Parent3.call(this, age) this.gender = gender}Child3.prototype = new Parent3Child3.prototype.constructor = Child3let child3 = new Child3('张三', 18, 'boy')console.log(child3) //Child3 {name: '张三', age: 18, gender: 'boy'}child2.say() // 张三将Child3的在此之后均须为Parent3的一个最简单,分界迭代和在此之后双链承袭相似,只是多了在Child3中所受聘Parent3的过程。最简单本体判别在构造线性中所,而原理则判别在构造线性的新近在此之后中所,同时将新近在此之后的constructor指向构造线性。可以通过instanceof和isPrototypeOf()来识别基于配对承袭创建者的某类。避免了在此之后双链和改作构造线性的缺陷,融合了它们的灵活性,被预选为JS中所最常以的承袭来进行。在此之后式承袭

来使在此之后可以基于已有的某类创建者新近某类,同时还仍要因此创建者自判别特性。

function object(obj) { function F(){} F.prototype = obj return new F()}let parent4 = { age: 18, name: '张三', say() { console.log(this.name) }}let child4 = object(parent4)console.log(child4) /**{[[Prototype]]: Object age: 18 name: "张三" say: ƒ say() [[Prototype]]: Object }*/child4.say() // 张三

在 object()线性实际上,先行创建者了一个临时性的构造线性,然后将盛行的某类作为这个构造线性的在此之后,最终回到了这个临时特性的一个新近最简单。从表象上讲,object()对盛行其中所的某类指派了一次较深解码

这种在此之后式承袭,要求不能要有一个某类可以作为另一个某类的为基础用这种手段创建者的某类相当于是盛行给定某类的副本

它其实就是ES5 Object.create的建模化解解决办法,将盛行的某类作为创建者某类的在此之后

在只想让一个某类与另一个某类保持相似的才不会,在此之后承袭是紧接全可以倚靠的。在此之后来进行下的缺陷:引用特性本体的交换解决办法。

寄生虫承袭

寄生虫式承袭与在此之后式承袭松散相关,与寄生虫构造线性和工厂来进行相似,即创建者一个仅用作封装承袭过程的线性,该线性在实际上以某种手段来强化某类,最终再继续回到某类。

function createAnother(original) { var clone = object(original) //通过线程线性创建者一个新近某类 clone.say = function(){ // 以某种手段来强化这个某类 console.log('nanjiu') }; return clone // 回到这个某类}

缺陷: 跟改作构造线性来进行一样,每次创建者某类都不会创建者一遍原理。

寄生虫支架承袭*

配对承袭是 JavaScript 最常以的承袭来进行;不过,它也有自己的不足。配对承袭最大的解决办法就是无论什么才不会,都不会线程两次超强特性构造线性:一次是在创建者子特性在此之后的时候,另一次是在子特性构造线性实际上。没错,子特性再继续次不会相关联超强特性某类的全部最简单本体,但我们一再在线程子特性构造线性时重写这些本体。

function object(o) { function F() {} F.prototype = o; return new F();}function prototype(child, parent) { var prototype = object(parent.prototype); prototype.constructor = child; child.prototype = prototype;}function Parent6(age) { this.age = age}Parent6.prototype.say = function() { console.log(this.name)}function Child6(name, gender) { this.name = name this.gender = gender}// 领域于prototype(Child6, Parent6);let child6 = new Child6('nanjiu', 'boy')console.log(child6) // Child6 {name: 'nanjiu', gender: 'boy'}child6.say() // nanjiu总结

JavaScript 主要通过在此之后双链化解解决办法承袭。在此之后双链的构建是通过将一个特性的最简单赋绝对值给另一个构造线性的在此之后化解解决办法的。这样,子特性就能够访问超强特性的所有本体和原理,这一点与基于类的承袭很相似。

在此之后双链的解决办法是某类最简单交换所有承袭的本体和原理,因此不适宜原则上领域于。化解这个解决办法的高效率是改作构造线性,即在子特性构造线性的实际上线程超强特性构造线性。这样就可以做到每个最简单都较强自己的本体,同时还能往超强特性构造线性中所发送到到给定,但是没有线性复用。领域于多于的承袭来进行是配对承袭,这种来进行领域于在此之后双链承袭交换的本体和原理,而通过改作构造线性承袭最简单本体。此外,还存有下列可可预选的承袭来进行。在此之后式承袭,可以在仍要预先行判别构造线性的才不会化解解决办法承袭,或多或少是指派对给定某类的较深解码。而解码想得到的副本还可以想得到有利于翻修。寄生虫式承袭,与在此之后式承袭非常相似,也是基于某个某类或某些信息创建者一个某类,然后强化某类,最终回到某类。为了化解配对承袭来进行由于多次线程超强特性构造线性而所致的主因解决办法,可以将这个来进行与配对承袭一起领域于。寄生虫支架承袭,集寄生虫式承袭和配对承袭的灵活性与一身,是化解解决办法基于特性承袭的最有效地手段。化解解决办法AJAX

迭代:

创建者XMLHttpRequest某类敞开双客户端 (均须催促特性,需催促统计数据在服务器的地址,前提异步i催促)向服务器发送到催促(get特性从外部发送到催促,post特性需设置催促背)接收服务器的响应统计数据(需根据XMLHttpRequest的readyState本体判定线程哪个回退线性)function ajax(url, method, data=null) { const xhr = XMLHttpRequest() // 咱们这里就不管IE低版本了 // open()原理,它接受3个给定:要发送到的催促的特性,催促的url和前提异步发送到催促的布尔绝对值。 xhr.open(method, url ,false) // 开启一个催促,现阶段还未有发送到 xhr.onreadyStatechange = function() { if(xhr.readyState == 4) { if ((xhr.status>= 200 && xhr.status < 300) || xhr.status == 304){ alert(xhr.responseText); } else { console.log("Request was unsuccessful: " + xhr.status); } } } if(method === 'post') { xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); } xhr.send(data) // get催促,data应为null,给定拼接在URL上}多维codice_扁平化function flat(arr) { const res = [] // 正则表达式化解解决办法 const stack = [...arr] // 解码一份 while(stack.length) { //取出解码栈内第一个类型 const val = stack.shift() if(Array.isArray(val)) { // 如果是codice_,就展开推入栈的最终 stack.push(...val) }else{ // 否则就推入res回到绝对值 res.push(val) } } return res}const arr = [1,[2],[3,4,[5,6,[7,[8]]]]]console.log(flat(arr)) //[1, 2, 3, 4, 5, 6, 7, 8]

当然你也可以用codice_除此以外的原理flat,将展开层数均须为Infinity绝对值,看看面试官搭车不搭车理你

const arr = [1,[2],[3,4,[5,6,[7,[8]]]]]console.log(arr.flat(Infinity)) //[1, 2, 3, 4, 5, 6, 7, 8]setTimeout 建模 setInterval

思维就是正则表达式线程setTimeout

function mySetInterval(callback, delay) { let timer = null let interval = () => { timer = setTimeout(()=>{ callback() interval() // 正则表达式 }, delay) } interval() // 先行指派一次 return { id: timer, clear: () => { clearTimeout(timer) } }}let time = mySetInterval(()=>{ console.log(1)},1000)setTimeout(()=>{ time.clear()},2000)setInterval 建模 setTimeout

思维就是setInterval指派一次后将setInterval清除需

function mySetTimeout(callback, delay) { let timer = null timer = setInterval(()=>{ callback() clearInterval(timer) },delay)}mySetTimeout(()=>{ console.log(1)},1000)sleep

化解解决办法一个线性,n秒后指派均须线性

function sleep(func, delay) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(func()) }, delay) })}function say(name) { console.log(name)}async function go() { await sleep(()=>say('nanjiu'),1000) //过一秒打印nanjiu await sleep(()=>say('侧边张三'),2000) // 再继续过两秒打印侧边张三}go()codice_去重的多种化解解决办法手段领域于Setlet arr = [1,2,3,2,4,5,3,6,2]function arrayToHeavy1(arr) { return [...new Set(arr)]}console.log(arrayToHeavy1(arr)) //[ 1, 2, 3, 4, 5, 6 ]领域于indexOffunction arrayToHeavy2(arr) { let newArr = [] for(let i=0; i { return arr.indexOf(item) == index })}console.log(arrayToHeavy3(arr)) //[ 1, 2, 3, 4, 5, 6 ]领域于Mapfunction arrayToHeavy4(arr) { let map = new Map() for(let i=0; i根据key给予URL上的给定绝对值

function queryData(key) { let url = window.location.href,obj = {} let str = url.split('?')[1] // 先行拿到上标末尾的所有给定 let arr = str.split('&') // 重新近配对给定 for(let i=0; i< arr.length; i++) { let kv = arr[i].split('=') obj[kv[0]] = decodeURIComponent(kv[1]) } console.log(url,obj) // {a: '1', b: '2', c: '3', name: '张三'} return obj[key]}//%E6%89%8B%E5%86%99/index.html?a=1&b=2&c=3&name=%E5%8D%97%E7%8E%96console.log(queryData('name')) // 张三斐波那契数列

F(n) = F(n - 1) + F(n - 2),其中所 n> 1

恐怖正则表达式版本function fib(n) { if(n == 0) return 0 if(n == 1 || n == 2) return 1 return fib(n-1) + fib(n-2)}// console.log(fib(4)) //F(4)=F(3)+F(2)=F(2)+F(1)+F(2)=1+1+1=3let t = +new Date()console.log(fib(40)) //102334155console.log(+new Date()-t) //783ms建模版本function fib2(n) { if(fib2[n] !== undefined) return fib2[n] if(n == 0) return 0 if(n == 1 || n == 2) return 1 const res = fib2(n-1) + fib2(n-2) fib2[n] = res return res}let t1 = +new Date()console.log(fib2(40)) //102334155console.log(+new Date()-t1) //5ms面世电子书

用过Vue的eventBus的老师不该很熟悉,$on电子书惨剧,$emit面世惨剧

class EventEmitter { constructor() { this.events = {} } // 电子书惨剧 on(event, callback) { if(!this.events[event]) { this.events[event] = [] } // 将惨剧对应的回退填入该惨剧的惨剧队列中所 this.events[event].push(callback) return this } //面世惨剧 emit(event, args) { const callbackList = this.events[event] if(callbackList.length) { callbackList.forEach(cb => cb.apply(this, args)) } return this } // 撤下电子书 off(event, callback) { // event没传,则撤下所有电子书的惨剧 if (typeof event === 'undefined') { delete this.events } else if (typeof event === 'string') { // 撤下均须惨剧的回退 if (typeof callback === 'function') { this.events[ event ] = this.events[ event ].filter((cb) => cb !== callback) } else { // 撤下整个惨剧 delete this.events[ event ] } } return this } // 只进行一次的惨剧电子书 once (event, callback, context) { const proxyCallback = (...args) => { callback.apply(context, args) // 回退线性指派紧接成之后就撤下惨剧电子书 this.off(event, proxyCallback) } this.on(event, proxyCallback, context) }}// 写紧接测一把const bus = new EventEmitter()// 先行电子书一个惨剧bus.on('add', () => { console.log('nanjiu')})// 面世惨剧。

半夜上吐下泻应急措施
河北白癜风医院挂号咨询
武汉看癫痫哪家医院最好
广西男科专科医院哪好
西安牛皮癣医院哪里最好
流感引起的咳嗽吃什么快速止咳
鼻部整容
喉咙痒咳嗽吃消炎药没效果
眼科
急支糖浆是什么药?
相关阅读

2022手机知名品牌竞争激烈,即将发布的四款手机,每一款都是梦中情机

视频 2025-11-09

笔记型电脑圈的相互竞争真的越来越白热化了,不光是笔记型电脑硬件的相互竞争,不够有定价上的相互竞争。2022年即将公开发表的这几款笔记型电脑,最世人大家期待。Galaxymate 50 P

河南濮阳新增本土2实有确诊和2实有无症状,详情公布

时尚 2025-11-09

据信阳濮阳市新冠肺癌疫情根除指挥部档案室谣言:3翌年9日0—24时,濮阳市新增调查结果2例新冠肺癌肺炎传染病(轻型)和2例水痘携带者。市、第一区疫情根除预案处置队伍持续开展流行病学调查、具体技术

评论者:“因疫情推迟还房贷”要因地制宜精准施策

八卦 2025-11-09

每经评论员 李玉雯近期全国霍乱防疫形势严峻,部份深受霍乱因素的小团体能否持续性利息本金?特别公众人物一度冲上热搜。目前为止,多家商业银行发表意见,另一款特别纾受困面壁弊端。比如,中国工商商业银

苹果电脑重新上架iPhone 8

音乐 2025-11-09

了解更多科技资讯尽在“圈聊科技”。现今跟大家聊一聊:小米twitter悄然上线最初iPhone,仅2000翻身的销价,库克妥妥稀释老使用者剩余价值! 小米Androi

江津区中医院开展儿童生长发育诊疗活动

八卦 2025-11-09

本文转自:网易重庆新闻节目 网易重庆3年末10日电 亦同,宜宾市中的医院脾胃病·内分泌科特邀重医附一院内分泌科领域专家任伟来院开展孩童代谢诊疗社交活动,主要针对4周岁以上身材偏

友情链接